接上一篇文章 Springboot+SpringSecurity不用模板引擎的登录功能,记录一些坑。
由于学艺不精,上一篇没有把问题描述出来,就是一个简单的小问题,我却改了一上午,才发现问题。
好了,看代码吧!
大家还记得这个代码吧,SpringSecurity自定义登录逻辑,坑就在这
@Slf4j
@Service
public class AuthorityServiceImpl implements AuthorityService {
// 注入dao层接口
@Resource
private AuthorityDao authorityDao;
// 重写UserDetailsService中的方法
@Override
public UserDetails loadUserByUsername(String username) {
QueryWrapper<Authority> qw = new QueryWrapper<>();
qw.eq("username",username);
Authority authority = authorityDao.selectOne(qw);
if (null == authority) {
throw new UsernameNotFoundException("用户名不存在");
}
// 把用户名存入session,这里这个获取session的工具类,我也给大家放到下边
// 存入session是方便获取到登录的用户名
GetSessionUtils.getSession().setAttribute("loginUsername",authority.getUsername());
// 这个User是SpringSecurity提供的,而不是自己写的,只需要传入账号密码,和权限,SpringSecurity会自己判断账号密码,密码应该是加密过后的密码,而不是明文,如何得到密文,在文章末尾我会给出
return new User(authority.getUsername(),authority.getPassword(),getAuthority());
}
// 指定一个权限,拥有该权限的才能登录
// 数据库里边存的是 ADMIN,并不是 ROLE_ADMIN
private List<GrantedAuthority> getAuthority() {
return AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN");
}
}
在多次测试后,我才发现了一个问题,如果这么写 getAuthority() 方法的话,就是写死的权限,即无论数据库的权限是啥,你登录的角色都会有 ROLE_ADMIN 权限,这也是很多教学视频上的写法(可能是我看的不太仔细,没有注意到这个点)。
然后我仔细想了一下,如果这么写,那么跟配置类的权限比对永远为 true,当然也肯是我太笨了。。。。嗯。。。继续继续,查数据库的权限,应该把这个方法稍加修改;
可以传入一个可变参数,然后通过遍历添加,这样是动态的,才能跟配置类对比。
或者直接这么写:
return new User(authority.getUsername(),authority.getPassword(),
AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_" + authority.getAuthority()));
解释一下这个位置的 ROLE_ 这个并不是一定要加的,只是在配置类权限对比的时候,使用 hasAnyRole 和 hasAnyAuthorites 的不同,如果加 ROLE_ ,则配置类就用 hasAnyRole,否则就用第二个;