Links
Comment on page

RBAC权限控制

hsweb提供了常规的RBAC权限控制,默认基于AOP实现。hsweb-authorization-api 模块中定义了权限相关接口,核心类:
Authentication : 用户的所有权限相关信息。
AuthenticationManager:用于管理用户的权限信息已经授权。
AuthenticationSupplier: 用于获取当前登录用户和指定用户的权限,可通过实现此接口来自定义权限获取方式。

注解权限控制声明

在需要进行权限控制的Controller 中注解@Authorize 以声明此接口需要控制权限。
属性列表:
属性名
说明
permission
权限标识,如: user-manager
action
操作,如: add
role
角色ID,如: admin
user
用户名,如: admin
logical
存在多个声明时使用的策略:
AND: 并且
OR: 或者
phased
验证时机:
before: 在请求之前
after: 在请求之后
ignore
忽略权限控制
description
权限说明
dataAccess
数据权限声明
注意:
  1. 1.
    在类上注解时,表示此类的所有接口都需要进行权限控制。
  2. 2.
    方法和类上的注解默认将合并处理,如:类注解@Authorize(permission="user-manager"),方法注解 @Authorize(action="add"),在权限控制时会合并为@Authorize(permission="user-manager",action="add")

自定义权限控制声明

在注解方式进行声明时,可能不能完全满足需求,比如要修改已经打了包的模块的权限控制声明。
实现接口: AopMethodAuthorizeDefinitionCustomizerParser ,实现parse 方法,返回 AuthorizeDefinition .即可。AuthorizeDefinition 的属性和Authorize注解基本一致,具体查看源代码即可。
如果返回EmptyAuthorizeDefinition 则表示不进行权限控制,如果返回null 则表示使用默认的权限定义。

事件

在进行权限控制时,会触发事件:AuthorizingHandleBeforeEvent ,可通过监听此事件,来实现自定义的权限控制。例如:
@EventListener
public void handEvent(AuthorizingHandleBeforeEvent event) {
if(event.getContext()
.getAuthentication()
.getUser()
.getUsername()
.equals("admin")){
//admin用户拥有所有权限
event.setAllow(true);
}
}
通过配置文件设置不进行权限控制的接口
application.yml
hsweb:
authorize:
allows:
users:
admin: * # admin用户可以访问全部接口
guest: **.query* # guest 可以返回query开头的方法
roles:
admin: *