引入 Spring Security 之后(Spring Security 的引入请浏览《SpringBoot 引入 Spring Security 备忘》),Spring Security 将会通过其内置的拦截器对URL进行拦截,以此来管理登录验证和用户权限验证。
当用户登陆时,会被 AuthenticationProcessingFilter 拦截,调用 AuthenticationManager 的实现类来验证用户信息,而 AuthenticationManager 是通过调用 AuthenticationProvider 的实现类来获取用户验证信息, 在 AuthenticationProvider 的实现类中将获取到的用户验证信息与通过 UserDetailsService 的实现类根据用户名称获取到的结果(UserDetails 的实现类)进行匹配验证,如果验证通过后会将用户的权限信息封装一个当前登录用户信息对象 放到 Spring Security 的全局缓存 SecurityContextHolder 中,以备后面访问资源时使用。
因此当我们自定义用户认证逻辑的时候,我们需要编写 AuthenticationProvider、UserDetailsService 和 UserDetails 的实现类,现在开始写代码
1、UserDetails 的实现类 SecurityUserInfo
public class SecurityUserInfo implements Serializable, UserDetails {
private static final long serialVersionUID = 1L;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 盐加密
*/
private String salt;
/**
* 角色码
*/
private String roleCode;
/**
* 帐号状态(0正常 1停用)
*/
private String status;
/**
* 删除状态(0正常 1删除)
*/
private String delFlag;
private boolean accountNonExpired;
private boolean accountNonLocked;
private boolean credentialsNonExpired;
private boolean enabled;
public SecurityUserInfo(String username, String password, String salt, String roleCode, String status, String delFlag,
boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, boolean enabled) {
this.username = username;
this.password = password;
this.salt = salt;
this.roleCode = roleCode;
this.status = status;
this.delFlag = delFlag;
this.accountNonExpired = accountNonExpired;
this.accountNonLocked = accountNonLocked;
this.credentialsNonExpired = credentialsNonExpired;
this.enabled = enabled;
}
/**
* 实现用户权限获取方法
*
* @return
*/
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return AuthorityUtils.commaSeparatedStringToAuthorityList(roleCode);
}
@Override
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(S