接口权限控制
大约 2 分钟
有句话说得好,前端的权限是为了用户体验,后端的权限是为了数据安全。之前我们使用 spring security 做权限控制,这个框架虽然非常强大,但是过于沉重,我们只需要简单的接口权限控制,所以决定自己实现一个。
快速开始
权限功能已经封装到了 simperfect-user-details 中,因为权限本身就是依赖用户信息的,所以直接封装在了用户信息工具包中。 权限我们使用了 AOP 封装,所以只需要在需要权限的 Controller
方法上使用注解 @HasAnyAuthority
即可。
提示
- 建议注解使用在
Controller
层,因为这个是接口权限控制的注解。 - 此注解只能作用在方法上,不能作用在类上。
- 此注解只是平替 spring security 中接口通配符的功能,无法实现细致复杂的权限控制。如果权限逻辑比较复杂,请自己在业务代码中实现更加细致的权限控制。
使用样例
只有管理员可以访问的接口
相对来讲也是比较常见的情况。
@RestController
public class ExampleController {
@HasAnyAuthority
@GetMapping("example")
public ResultVO<List<ExampleDTO>> query() {
return exampleService.query();
}
}
有 xxx 权限以及管理员可以访问
多数接口都是这种情况。
@RestController
public class ExampleController {
@GetMapping("example")
@HasAnyAuthority("xxx")
public ResultVO<List<ExampleDTO>> query() {
return exampleService.query();
}
}
只有 xxx 权限可以访问
这种情况比较少见。
@RestController
public class ExampleController {
@GetMapping("example")
@HasAnyAuthority(value = "xxx", administratorAuthenticated = false)
public ResultVO<List<ExampleDTO>> query() {
return exampleService.query();
}
}
参数详解
这个注解实际上只有两个参数:skillCodes
和 administratorAuthenticated
,其中的 value
参数只是为了用起来方便,是对 skillCodes
的映射。
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
value | String[] | {} | skillCodes 的别名。例如:@HasAnyAuthority("bp_xxx") 等同于 @HasAnyAuthority(skillCode = "bp_xxx") 。 |
skillCodes | String[] | {} | 可以传入技能码 或 技能码数组,只有有一个技能存在那么用户就有权限访问这个方法。 注意:如果不填值,则代表验证是否为管理员(admin 账号 或 拥有 administrator 技能) |
administratorAuthenticated | boolean | true | 如果是管理员是否默认通过验证 注意:为 admin 账号 或 拥有 administrator 技能都算管理员 |