SpringSecurity 集成 JWT 报错 Access is denied 不允许访问
1、具体业务场景及报错信息
在给 接口 做访问控制时 使用(这里已经开启了开启基于方法的安全认证机制 @EnableGlobalMethodSecurity(prePostEnabled = true))
@PreAuthorize("hasAuthority('sys:role:perm')")
无效 ,前端页面访问 报错
2、问题排查
1、怀疑没往UserDetail里面塞值,打印确实有塞
2022-05-04 15:54:59.737 INFO 17844 --- [nio-8081-exec-1] c.m.sercurity.UserDetailServiceImpl : 权限信息为---->[ROLE_admin, ROLE_normal, sys:manage, sys:user:list, sys:role:list, sys:menu:list, sys:tools, sys:role:save, sys:user:save, sys:user:update, sys:user:delete, sys:user:role, sys:user:repass, sys:role:update, sys:role:delete, sys:role:perm, sys:menu:save, sys:menu:update, sys:menu:delete, sys:dict:logs]
2、怀疑当前用户没有权限
在要拦截的url上去掉相关校验后,获取当前用户的权限信息
System.out.println(SecurityContextHolder.getContext().getAuthentication());
发现确实没有值
排查发现解析jwt token 的时候 没有将 权限信息塞进去,直接传的null
3、解决方案:查出当前用户的权限及其角色信息 ,将值塞进去
4、开启接口权限校验并且验证
正常访问
且有用户角色权限 相关信息
SUCCESS!!!!!!!!