开发者学堂课程【Spring Security知识精讲与实战演示(二):认证用户状态的判断】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/731/detail/13041
认证用户状态的判断
启动项目,会进入登录页面。
进入数据库,目前用户有两个,分别是小明,小马。小明的状态是0,小马的状态是1。
分别登录小明、小马,密码123,显示可以正常登录。
虽然认证做完,但并没有用到状态信息,接下来要利用状态信息,让用户拥有状态。在企业开发中用户是要有状态的,如果没有状态,有些用户可能会恶意操作系统,假设要封锁他的账号,没有状态是无法实现的,只有将数据库数据删除,但是企业开发中一般不会真正的删除数据,一般是拉入黑名单状态。在企业开发中状态会非常多,根据不同业务可以设置很多状态,现在数据库中只有两个:
下面是认证的部分业务逻辑:
SysUser sysUser = userDao.findByName(username);
if(sysUser==null) {
return null;
}
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
List<SysRole> roles = sysUser.getRoles();
for (SysRole role : roles){
authorities.add(new SimpleGrantedAuthority(role.getRol
eName()));
// {noop} 后面的密码,springsecurity 会认为是原文。
UserDetails userDetails = new User(sysUser.getUsername(),sysUser.getPassword(),authorities);
return userDetails;
UserDetails userDetails = new User(sysUser.getUsername(),sysUser.getPassword(),authorities);
这一句的作用是将自己的用户对象翻译成Spring security的用户对象,也就是自定义的对象sysUser,Spring security的用户对象是UserDetails,但Spring security不认识用户自定义的对象,只是别UserDetails。所以要将这两个用户对象进行转换或者翻译。在这里面,在进行翻译时,用的是user,注意这是Spring security提供的。
点进原码:
public User(String username,String password,Collection<? extends Granteduthority> authorities){
public User(String username,String password, boolean enabled, boolean accountlonExpired, boolean credentialsNonExpired,boolean accountNonLocked,Collection<? extends GrantedAuthority>authorities) {
可以看到,这个构造方法里比上面多了四个布尔类型的构造参数,其实我们使用的三个构造参数的构造方法里这四个布尔值默认都被赋值为 true, boolean 的意思可点击右上角 Download Sources 下载原码查看解释:
boolean enabled 是否可用
boolean accountNonExpired 账户是否失效
账户失效可以是触犯法律或者用户不再使用
boolean credentialsNonExpired 秘密是否失效
一般为了账号安全,有些公司的密码隔段时间就会更改
boolean accbuntNonLocked 账户是否锁定
当四个布尔值默认值都为 true 才能进行使用。
演示一个默认值不为 TRUE 的情况,更改代码:
SysUser sysUser = userDao.findByName(username);
if(sysUser==null) {
return null;
}
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
List<SysRole> roles = sysUser.getRoles();
for (SysRole role : roles){
authorities.add(new SimpleGrantedAuthority(role.getRol
eName()));
// {noop} 后面的密码,springsecurity 会认为是原文。
UserDetails userDetails = new User(sysUser.getUsername(),sysUser.getPassword(),
enabled:sysUser.getStatus ()==1,
accountNonExpired: true,
credentialsNonExpired: true,
accountNonLocked: true,
authorities);
return userDetails;
在企业开发中,accountNonExpired,credentialsNonExpired,accountNonLocked
也需要进行判断。
之后对项目进行双击测试状态
访问小马,状态为1,访问成功;访问小明,显示登录失败,失败原因:是个布尔值必须都为TRUE才能登录成功。
在企业开发中,用户状态判断一定要做,但用几个状态根据公司业务判定。