权限校验最佳实践模型-快捷使用清单
🔹 注解使用
| 注解 | 作用 | 示例 |
|---|---|---|
@Anonymous |
允许匿名访问 | @Anonymous @GetMapping("/public") |
@RequiresPermission("xxx") |
需要单个权限 | @RequiresPermission("user:add") |
@RequiresPermission(value={"a","b"}, logical=Logical.OR) |
任一权限 | 满足a或b即可 |
@RequiresPermission(value={"a","b"}, logical=Logical.AND) |
所有权限 | 必须同时有a和b |
@RequiresRole("xxx") |
需要角色 | @RequiresRole("admin") |
🔹 获取用户信息
// 可能为null
LoginUserVO user = SecurityUtils.getLoginUser();
Long userId = SecurityUtils.getUserId();
String username = SecurityUtils.getUsername();
// 必须有值,否则抛异常
LoginUserVO user = SecurityUtils.requireLoginUser();
Long userId = SecurityUtils.requireUserId();
🔹 权限校验(失败抛异常)
SecurityUtils.checkPermission("user:add"); // 单权限
SecurityUtils.checkPermission("user:add", "user:edit"); // 必须同时有
SecurityUtils.checkAnyPermission("user:add", "user:edit"); // 有任一即可
SecurityUtils.checkRole("admin"); // 单角色
SecurityUtils.checkAnyRole("admin", "manager"); // 有任一即可
🔹 权限判断(返回boolean)
boolean has = SecurityUtils.hasPermission("user:add");
boolean hasAny = SecurityUtils.hasAnyPermission("user:add", "user:edit");
boolean isAdmin = SecurityUtils.isAdmin();
boolean isSuperAdmin = SecurityUtils.isSuperAdmin();
boolean isLoggedIn = SecurityUtils.isAuthenticated();
🔹 数据级权限
// 只允许本人或管理员
SecurityUtils.checkSelfOrAdmin(userId);
// 只允许资源所有者
SecurityUtils.checkOwner(ownerId);
// 本人或任意管理员
SecurityUtils.checkSelfOrAnyAdmin(userId);
// 判断(不抛异常)
boolean can = SecurityUtils.isSelfOrAdmin(userId);
🔹 认证状态
SecurityUtils.requireAuthenticated(); // 必须已登录
SecurityUtils.requireNotAuthenticated(); // 必须未登录(用于登录接口)
🔹 常用代码模板
// 模板1:需要登录的接口
@PostMapping("/xxx")
public Result doSomething() {
Long userId = SecurityUtils.requireUserId();
// 业务逻辑
}
// 模板2:数据级权限
@GetMapping("/{id}")
public Result getResource(@PathVariable Long id) {
Resource r = resourceService.getById(id);
SecurityUtils.checkSelfOrAdmin(r.getUserId());
return Result.ok(r);
}
// 模板3:条件显示
@GetMapping("/page")
public Result getPage() {
Map<String, Object> data = new HashMap<>();
data.put("canEdit", SecurityUtils.hasPermission("xxx:edit"));
data.put("canDelete", SecurityUtils.hasPermission("xxx:delete"));
return Result.ok(data);
}
// 模板4:删除自己的资源
public void deleteResource(Long id) {
Resource r = repository.findById(id);
SecurityUtils.checkOwner(r.getUserId());
repository.delete(r);
}
项目分区导航:⬅️ 01-权限校验最佳实践模型讲解 | 02-权限校验最佳实践模型-快捷使用清单 | ➡️ 03-权限校验最佳实践模型代码
💬 评论