Spring Security 注解详解:@RequiresAuthentication、@RequiresPermissions 与 @RequiresRoles

发布时间:2026/7/3 16:50:12

Spring Security 注解详解:@RequiresAuthentication、@RequiresPermissions 与 @RequiresRoles 在 Spring Security 中权限控制是保障系统安全的重要环节。本文将详细解析三个核心安全注解RequiresAuthentication、RequiresPermissions 和 RequiresRoles 的异同点并提供代码示例。一、注解概述RequiresAuthentication作用要求用户必须已认证登录才能访问该方法或类级别最基本的权限控制特点不关心用户的具体权限或角色只验证是否登录RequiresPermissions作用要求用户必须拥有指定的权限才能访问级别细粒度的权限控制特点基于权限字符串进行验证灵活性高RequiresRoles作用要求用户必须属于指定的角色才能访问级别粗粒度的权限控制特点基于角色进行验证通常角色会关联一组权限二、异同点对比三、代码示例1.RequiresAuthentication 示例importorg.apache.shiro.authz.annotation.RequiresAuthentication;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassAuthController{GetMapping(/profile)RequiresAuthenticationpublicStringgetUserProfile(){return用户个人资料需登录访问;}}2.RequiresPermissions 示例importorg.apache.shiro.authz.annotation.RequiresPermissions;importorg.springframework.web.bind.annotation.*;RestControllerRequestMapping(/document)publicclassDocumentController{GetMapping(/{id})RequiresPermissions(document:read)publicStringreadDocument(PathVariableStringid){return读取文档ID: id;}PostMappingRequiresPermissions(document:create)publicStringcreateDocument(){return创建新文档;}}3.RequiresRoles 示例importorg.apache.shiro.authz.annotation.RequiresRoles;importorg.springframework.web.bind.annotation.*;RestControllerRequestMapping(/admin)publicclassAdminController{GetMapping(/dashboard)RequiresRoles(admin)publicStringadminDashboard(){return管理员仪表盘;}GetMapping(/audit)RequiresRoles({admin,auditor})publicStringauditLogs(){return审计日志管理员或审计员可访问;}}4.组合使用RestControllerRequestMapping(/system)publicclassSystemController{GetMapping(/settings)RequiresAuthenticationRequiresRoles(admin)RequiresPermissions(system:configure)publicStringsystemSettings(){return系统设置需登录管理员角色配置权限;}}四、高级用法与注意事项1逻辑关系多个注解同时使用时是”与”关系同一注解多个值是”或”关系如RequiresRoles({“admin”, “superadmin”})2自定义错误处理ControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(AuthorizationException.class)publicResponseEntityStringhandleAuthException(AuthorizationExceptione){returnResponseEntity.status(HttpStatus.FORBIDDEN).body(访问被拒绝: e.getMessage());}}3.性能考虑权限检查会在每次请求时执行对于频繁访问的接口考虑缓存权限信息4.测试建议SpringBootTestAutoConfigureMockMvcclassSecurityAnnotationTest{AutowiredprivateMockMvcmockMvc;TestWithMockUservoidtestRequiresAuthentication()throwsException{mockMvc.perform(get(/profile)).andExpect(status().isOk());}TestWithMockUser(rolesadmin)voidtestRequiresRoles()throwsException{mockMvc.perform(get(/admin/dashboard)).andExpect(status().isOk());}}五、总结选择依据只需验证登录状态 → RequiresAuthentication基于业务功能控制 → RequiresPermissions基于用户角色分类 → RequiresRoles最佳实践优先使用RequiresPermissions实现细粒度控制角色用于用户分类权限用于功能控制复杂场景可以组合使用多个注解

相关新闻