您觉得本文档还缺少什么内容?可以自己补充~
菜单/按钮权限
前端的菜单路由信息,通过后端接口动态返回,后端菜单解决根据用户 -查-> 角色 -查-> 菜单/按钮, 将用户拥有的资源返回。
URI权限控制
- 原理
项目启动时, 会加载到spring.factories文件中的
SecurityConfiguration
配置类, 然后实例UriSecurityPreAuthAspect
和VerifyAuthFunction
,UriSecurityPreAuthAspect
定义了@Around
, 会对标记了@PreAuth
注解和com.becypress.basic.base.controller.*.*(..)
包下的方法进行切入, 被切入的方法会进行权限验证, 验证逻辑是: 从上下文中取出当前用户, 然后远程查询认证服务, 获取当前用户的所有权限, 跟@PreAuth注解上的编码进行比对是否拥有指定权限. - 当子类Controller想要覆盖父类Controller 方法上的标记的@PreAuth权限编码, 必须在子类的方法上标记 @PreAuth 注解覆盖父类.
@Override
@PutMapping
// 重写父类方法后,可以@PreAuth 重写父类权限
@PreAuth("hasAnyPermission('{}edit')")
public R<User> update(UserUpdateDTO userUpdateDTO) {
//...
}
- 权限调试流程: UriSecurityPreAuthAspect#preAuth -> VerifyAuthFunction -> UserServiceImpl#getSysUserById
- 通过全局配置可以控制权限判断
bc:
security:
enabled: true # true 全局启用URI权限验证 false 全局禁用URI权限 设置成false后,标记的@PreAuth注解将会失效
caseSensitive: false # true: 区分大小写 false: 忽略大小写
- 注解
@PreAuth(enabled = false)
标记在类上,就禁用单个类的URI权限控制, 标记在单个方法上就禁用单个方法的URI权限控制 - @PreAuth 的replace属性用于替换 value中的
{}
@PreAuth(replace = "authority:dictionary:", value = "hasAnyPermission('{}view')")
@PreAuth 的 value 中可以配置的方法为
VerifyAuthFunction
类中的所有public 方法, 包括:permit : 忽略权限判断, 视为有权限
- denyAll :忽略权限判断, 视为无权限
- hasAnyPermission : 是否拥有任意一个指定的权限
- hasNoPermission : 是否不含指定权限
- hasPermission : 是否拥有所有指定权限
- hasAnyRole : 是否拥有任意一个指定的角色
- hasRole : 是否拥有所有指定权限
- hasNoRole : 是否不含指定角色 上述方法可以按下面的方式使用 :
@PreAuth("permit()")
@PreAuth("denyAll()")
@PreAuth("hasPermission('authority:user:add', 'authority:user:edit')")
@PreAuth("hasRole('SUPER_ADMIN')")