基于微服务架构的SpringBoot应用如何实现方法级授权?
Spring Boot微服务方法级授权实现方案
你现有Security配置已经开启了@EnableGlobalMethodSecurity的三类注解支持,可任选以下方式实现仅USER_ADMIN角色可访问/save接口的权限控制:
方案1:使用@PreAuthorize注解(最常用,支持SpEL表达式)
直接在Controller的save方法上添加注解即可,修改后代码如下:
@PostMapping(value = "/save") @PreAuthorize("hasRole('USER_ADMIN')") // 若系统角色无ROLE_前缀则改用hasAuthority('USER_ADMIN') public Object save(@ModelAttribute Course course) { try { Course dbCourse = courseService.save(course); log.info("course saved method called"); log.info("HttpStatus===" + new ResponseEntity<>(HttpStatus.OK)); return course; } catch (Exception e) { e.printStackTrace(); log.info("Exception: " + e); log.error("occur an error when viewing all courses"); return new ResponseEntity<Course>(HttpStatus.BAD_REQUEST); } }
说明:hasRole会自动给角色拼接ROLE_前缀做匹配,hasAuthority会完全匹配你传入的角色字符串,可根据系统角色存储规则二选一。
方案2:使用@Secured注解
代码如下:
@PostMapping(value = "/save") @Secured("ROLE_USER_ADMIN") // 必须完整匹配带前缀的角色编码 public Object save(@ModelAttribute Course course) { // 原有业务逻辑保持不变 }
方案3:使用JSR250标准@RolesAllowed注解
代码如下:
@PostMapping(value = "/save") @RolesAllowed("ROLE_USER_ADMIN") // 同样需要匹配完整带前缀的角色编码 public Object save(@ModelAttribute Course course) { // 原有业务逻辑保持不变 }
补充说明
- 所有注解的校验逻辑由Spring Security自动触发,无需手动编码实现
- 若当前用户角色不匹配,接口会直接返回403 Forbidden状态码,不会进入方法内部逻辑
- 你已配置的JWT过滤器会自动将解析后的用户角色信息注入安全上下文,无需额外调整过滤器逻辑
内容的提问来源于stack exchange,提问作者Ranuga Udayanga
相关产品推荐
相关产品推荐

