--- title: "02-权限校验最佳实践模型-快捷使用清单" created: 2025-12-03 tags: - 项目 aliases: - 权限校验最佳实践模型-快捷使用清单 --- # 权限校验最佳实践模型-快捷使用清单 ### **🔹 注解使用** | **注解** | **作用** | **示例** | | --- | --- | --- | | `@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")` | ### **🔹 获取用户信息** ```java // 可能为null LoginUserVO user = SecurityUtils.getLoginUser(); Long userId = SecurityUtils.getUserId(); String username = SecurityUtils.getUsername(); // 必须有值,否则抛异常 LoginUserVO user = SecurityUtils.requireLoginUser(); Long userId = SecurityUtils.requireUserId(); ``` ### **🔹 权限校验(失败抛异常)** ```java SecurityUtils.checkPermission("user:add"); // 单权限 SecurityUtils.checkPermission("user:add", "user:edit"); // 必须同时有 SecurityUtils.checkAnyPermission("user:add", "user:edit"); // 有任一即可 SecurityUtils.checkRole("admin"); // 单角色 SecurityUtils.checkAnyRole("admin", "manager"); // 有任一即可 ``` ### **🔹 权限判断(返回boolean)** ```java 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(); ``` ### **🔹 数据级权限** ```java // 只允许本人或管理员 SecurityUtils.checkSelfOrAdmin(userId); // 只允许资源所有者 SecurityUtils.checkOwner(ownerId); // 本人或任意管理员 SecurityUtils.checkSelfOrAnyAdmin(userId); // 判断(不抛异常) boolean can = SecurityUtils.isSelfOrAdmin(userId); ``` ### **🔹 认证状态** ```java SecurityUtils.requireAuthenticated(); // 必须已登录 SecurityUtils.requireNotAuthenticated(); // 必须未登录(用于登录接口) ``` ### **🔹 常用代码模板** ```java // 模板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 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-权限校验最佳实践模型讲解|01-权限校验最佳实践模型讲解]] | 02-权限校验最佳实践模型-快捷使用清单 | ➡️ [[03-权限校验最佳实践模型代码|03-权限校验最佳实践模型代码]]