角色没有ADMIN权限,为什么还能登录成功

接上一篇文章 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,否则就用第二个;

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值