加密方式
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
获得一个加密后的密码存进数据库,用于第一次登录
设置一些角色
分配给这个用户系统管理员的角色
接着需要一个springSecurity能识别的用户类,即一个实体实现UserDetails接口
@Getter
@Setter
@ApiModel(value = "User对象", description = "")
@Builder
public class User implements UserDetails {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("账号")
private String account;
private String password;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty("是否禁用")
private Boolean disable;
@ApiModelProperty("邮箱")
private String mail;
private Set<String> roles;//用户一登陆会初始化这些参数
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.roles.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet());
}
@Override
public String getUsername() {
return this.account;
}
@Override
public boolean isAccountNonExpired() {
//账号是否没过期
return true;
}
@Override
public boolean isAccountNonLocked() {
//账号是否没有被锁定
return true;
}
@Override
public boolean isCredentialsNonExpired() {
//凭证是否没有过期
return true;
}
@Override
public boolean isEnabled() {
//账号是否能用
return !this.disable;
}
}
然后需要一个Service类实现UserDetailsService接口,来重写方法,使SpringSecurity获得登陆人账号密码并校验的能力
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService, UserDetailsService {
@Autowired
UserMapper userMapper;
@Autowired
UserRoleMapper userRoleMapper;
@Autowired
RoleMapper roleMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (StringUtils.isBlank(username)) {
//null,""," "都会返回true
throw new BizException("用户名不能为空!");
}
User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
.select(User::getId, User::getAccount, User::getName, User::getPassword, User::getDisable, User::getMail)
.eq(User::getAccount, username));
if(Objects.isNull(user)){
throw new BizException("用户名不存在");
}
return convertUserDetail(user);
}
private UserDetails convertUserDetail(User user) {
//封装登录信息
List<Object> objectList = userRoleMapper.selectObjs(new LambdaQueryWrapper<UserRole>().select