接口权限控制
轻量级的访问权限控制,一个注解与一个接口即可完成权限控制。
本组件适用于以下项目:
- 需要对不同的用户做不同的权限控制
- 需要对接口做组合权限判定
不适用于以下项目(推荐使用 接口限制器 ):
- 没有登录系统
- 没有角色等访问者身份区分方式
注:完整注释请clone本项目
-
添加Jitpack仓库源
maven
<repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
-
添加依赖
maven
<dependencies> <dependency> <groupId>com.github.Verlif</groupId> <artifactId>permission-spring-boot-starter</artifactId> <version>版本号</version> </dependency> </dependencies>
-
启用服务
在任意配置类上使用
@EnablePermission
注解启用接口权限控制
PermissionHandler
是权限处理接口,用于对权限无法通过的处理。
内置的实现类会抛出NoPermDataException
与NoPermissionException
异常,可以通过 全局异常处理 组件来处理这些异常,
也可以通过构造实现类来完成自定义逻辑。实现接口后,需要加上@Component
来注入到Bean池,这样权限控制器才可以找到它。
public class DefaultPermissionHandler implements PermissionHandler {
@Override
public Object onNoPermData() {
throw new NoPermDataException();
}
@Override
public Object onNoPermission(PermData<?> data, Perm perm, Method method) {
throw new NoPermissionException();
}
}
PermissionDetector
是权限判定接口,是权限判定核心。内置的实现类实现了基础的权限判定,但未实现权限数据的获取。
开发者必须实现自己的判定实例。实现后与PermissionHandler
相同,需要自定注入Bean池中。
public class DefaultPermissionDetector implements PermissionDetector<Object> {
public DefaultPermissionDetector() {
}
/**
* 权限数据是否拥有角色
* @param data 权限数据,从下面的{@link #getRequestData()}获取的权限数据
* @param role @Perm的hasRole参数
* @return 权限数据是否拥有角色
*/
@Override
public boolean hasRole(PermData<Object> data, Object role) {
return data.getRoles().stream().anyMatch(o -> o == role);
}
/**
* 权限数据是否拥有权限
* @param data 权限数据,从下面的{@link #getRequestData()}获取的权限数据
* @param key @Perm的hasKey参数
* @return 权限数据是否拥有权限
*/
@Override
public boolean hasKey(PermData<Object> data, String key) {
return data.getKeys().stream().anyMatch(s -> s.equals(key));
}
/**
* 主要实现以下方法,这个方法用于获取当前的访问者权限数据
**/
@Override
public PermData<Object> getRequestData() {
return null;
}
}
PermData
是一个权限数据接口。一般的应用场景是让项目中的User
去实现这个接口,然后在上面的getRequestData()
方法中返回访问者的User
对象。
@Perm
注解用于API接口上或是Controller
类上。
/**
* 获取个人信息时,需要登录用户
*/
@Perm(hasRole = "user")
@Operation(summary = "获取个人信息")
@GetMapping("/self")
public BaseResult<?> selfInfo(){
return userBiz.getSelfInfo();
}
权限配置属性如下:
station:
# 权限功能配置
permission:
# 权限功能是否开启
enabled: true