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!!!!!!!!

 

posted @ 2022-05-04 22:59  KwFruit  阅读(1084)  评论(0编辑  收藏  举报