我希望能够稍微更改 spring 安全性,以便可以通过 Principal 对象访问名称、电子邮件。
还要登录,我想使用电子邮件而不是用户名。
我从哪里开始,或者这是否已经可行?
最佳答案
也不是不可能。不过,您需要提供自己的 UserDetails 实现。一点也不难。 This article显示了一种可能的方法来做到这一点。下面是我最近使用的一些代码:
我首先提供适合我目的的我自己的 UserDetails 实现。实际上,我在 Staff 类中拥有所有额外的详细信息,并且只拥有从 MyUser 到 Staff 的多对一引用。但是,我针对此答案对其进行了简化,只是将 fullName 和 email 属性直接包含在 MyUser 类中。
public class MyUser implements UserDetails {
@NotNull
@Size(min = 3, max = 50)
private String username;
@NotNull
@Size(min = 3, max = 256)
private String password;
private Boolean enabled;
private Boolean accountNonLocked;
private Boolean accountNonExpired;
private Boolean credentialsNonExpired;
private String email;
private String fullName;
private GrantedAuthority authorities;
@Override
public Collection<GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String toString() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return this.accountNonExpired;
}
@Override
public boolean isCredentialsNonExpired() {
return this.credentialsNonExpired;
}
@Override
public boolean isAccountNonLocked() {
return this.accountNonLocked;
}
@Override
public boolean isEnabled() {
return this.enabled;
}
public String getEmail(){
return email;
}
public String getFullName(){
return fullName;
}
}
然后我提供了我自己的用户详细信息服务实现,因为我使用 Hibernate 将所有内容保存在数据库中。您可能需要不同的实现:
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
UserDetails userDetails = null;
TypedQuery<MyUser> q = MyUser
.findMyUsersByUsernameEquals(username);
userDetails = q.getSingleResult();
if (userDetails == null)
throw new UsernameNotFoundException("user not found");
return userDetails;
}
}
然后在 applicationContext-security.xml 文件中我添加了这个:
<!-- Add a custom UserDetailsService -->
<beans:bean id="udservice" class="my.package.name.security.MyUserDetailsService"></beans:bean>
还有这个:
<!-- Configure Authentication mechanism -->
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="udservice">
<password-encoder hash="sha-256" />
</authentication-provider>
</authentication-manager>
现在,当您访问登录的用户时,您将获得您的类的实例并访问其所有属性。
关于java - Spring 安全定制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12254166/