API权限 #
注意
从此开始、之后的权限指的是RBAC权限
这里的API权限通常指的是@Mapping注解标记过的方法的权限
如下的接口就具有权限
@Roles("zxc")
@GetMapping("/role-zxc")
public String roleZxc() {
return "ok";
}
1. @Auth、@Roles和@Perms #
1.1 @Auth #
当需要给接口添加权限时,如接口需要角色zxc才能访问时,可以如下使用
@Auth(requireRoles = "zxc")
@GetMapping("/role-zxc")
public String roleZxc() {
return "ok";
}
接口需要权限user:create才能访问时,可以如下使用
@Auth(requirePermissions = "user:create")
@GetMapping("/create-user")
public String createUser() {
return "ok";
}
接口需要权限user:delete以及角色admin才能访问时,可以如下使用
@Auth(requireRoles = "admin", requirePermissions = "user:delete")
@GetMapping("/delete-user")
public String deleteUser() {
return "ok";
}
1.2 @Roles和@Perms #
在一般情况下,某个接口只会限制一种类型,如需要某种角色或者需要某种权限才能访问,那么使用@Auth就有点太麻烦了,所以这里有两个简写@Roles
和 @Perms
@Roles <==> @Auth中的role权限配置,@Perms <==>@Auth中的permission权限配置
所以上述接口可以这样写
@Roles("zxc") // <==> @Auth(requireRoles = "zxc")
@GetMapping("/role-zxc")
public String roleZxc() {
return "ok";
}
@Perms("user:create") // <==> @Auth(requirePermissions = "user:create")
@GetMapping("/create-user")
public String createUser() {
return "ok";
}
@Roles("zxc")
@Perms("user:delete") // <==> @Auth(requireRoles = "admin", requirePermissions = "user:delete")
@GetMapping("/delete-user")
public String deleteUser() {
return "ok";
}
1.3 exclude(排除) #
- 如果某个接口不是需要某种角色,而是排除某种角色,如某个接口不让role为
ban
的用户访问,那么可以这样写
@Roles(exclude = "ban") <==> @Auth(excludeRoles = "admin")
- 如果某个接口不是需要某种权限,而是排除某种权限,如某个接口不让有权限为
forbid:all
的用户访问,那么可以这样写
@Perms(exclude = "forbid:all") <==> @Auth(excludePermissions = "forbid:all")
2. Controller的权限 #
当某个controller中的所有接口都需要验证权限时,如专属给admin的controller,所有的接口都需要验证用户是否有admin权限,那么就可以在Controller上添加 @Roles。
@Roles("admin")
@RestController
@RequestMapping("/admin-api")
public class AuthzController {
@GetMapping("/get-data")
public String getData() {
return "ok";
}
@PostMapping("/put-data")
public String putData(Map<String,String> data) {
return "ok";
}
}
以上 <==>
@RestController
@RequestMapping("/admin-api")
public class AuthzController {
@Roles("admin")
@GetMapping("/get-data")
public String getData() {
return "ok";
}
@Roles("admin")
@PostMapping("/put-data")
public String putData(Map<String,String> data) {
return "ok";
}
}
若其中的某几个方法还需要其他的role,可以继续添加。
@Roles("admin")
@RestController
@RequestMapping("/admin-api")
public class AuthzController {
@Roles("zxc")
@GetMapping("/get-data")
public String getData() {
return "ok";
}
@PostMapping("/put-data")
public String putData(Map<String,String> data) {
return "ok";
}
}
/admin-api/get-data
权限验证逻辑整体上看为先验证是否满足controller上的权限,再验证是否满足方法的权限
3. 权限并、权限或 #
3.1 权限并 #
权限并
当某一些接口只能用户同时存在几种身份时才能访问,这就是权限的并
- 用户只有在同时拥有【zxc】【admin】 这两种role权限时才能访问接口
@Roles("zxc,admin") // <==> 用户只有在同时拥有【zxc】【admin】 这两种role权限时才能访问接口
@GetMapping("/get-data")
public String getData() {
return "ok";
}
- 用户只有在同时拥有【r1】【r2】 这两种role权限时就会被拒绝访问接口
@Roles(exclude = "r1,r2") // <==> 用户只有在同时拥有【r1】【r2】 这两种role权限时就会被拒绝访问接口
@GetMapping("/get-data")
public String getData() {
return "ok";
}
- 用户只有在同时拥有【role1】【role2】 这两种role权限时才能访问Controller里面的所有接口
@Roles("role1,role2") // <==> 用户只有在同时拥有【role1】【role2】 这两种role权限时才能访问Controller里面的所有接口
@RestController
@RequestMapping("/admin-api")
public class AuthzController {
@GetMapping("/get-data")
public String getData() {
return "ok";
}
@PostMapping("/put-data")
public String putData(Map<String,String> data) {
return "ok";
}
}
3.2 权限或 #
权限或
当某一些接口允许要么A访问要么B访问,但是就不让C访问,这就是权限的或
- 用户要么拥有【zxc】要么拥有【admin】 这两种role权限的任意一个时才能访问接口
@Roles({"admin","zxc"}) // <==> 用户要么拥有【zxc】要么拥有【admin】 这两种role权限的任意一个时才能访问接口
@GetMapping("/get-data")
public String getData() {
return "ok";
}
- 用户要么拥有【r1】要么拥有【r2】 这两种role权限的任意一个时就会拒绝访问接口
@Roles(exclude = {"r1","r2"}) // <==> 用户要么拥有【r1】要么拥有【r2】 这两种role权限的任意一个时就会拒绝访问接口
@GetMapping("/get-data")
public String getData() {
return "ok";
}
- 用户要么拥有【role1】要么拥有【role2】 这两种role权限的任意一个时才能访问Controller里面的所有接口
@Roles({"role1","role2"}) // <==> 用户要么拥有【role1】要么拥有【role2】 这两种role权限的任意一个时才能访问Controller里面的所有接口
@RestController
@RequestMapping("/admin-api")
public class AuthzController {
@GetMapping("/get-data")
public String getData() {
return "ok";
}
@PostMapping("/put-data")
public String putData(Map<String,String> data) {
return "ok";
}
}
3.3. 权限并与或的混合使用 #
权限并与或的混合使用
当某一些接口的验证逻辑很复杂,那么允许并与或混合使用
- 要么拥有角色【r1】,要么拥有角色【r2】,要么同时拥有角色【r3和r4】时才能访问接口
@Roles({"r1","r2","r3,r4"}) // <==> 要么拥有角色【r1】,要么拥有角色【r2】,要么同时拥有角色【r3和r4】时才能访问接口
@GetMapping("/get-data")
public String getData() {
return "ok";
}