Spring Boot子类Controller的@PreAuthorize注解失效问题咨询
你的问题核心在于Spring Security的类级@PreAuthorize注解默认不会被派生类继承到基类的方法上——派生类的类级注解只会作用于自己定义的方法,基类继承来的方法不会触发派生类的权限校验,所以看起来像是注解被忽略了。
以下是几种可行的解决办法:
解决方法1:重写基类方法复用权限规则
在派生类中重写基类的目标方法,无需修改业务逻辑,直接调用父类实现即可触发派生类的类级权限校验:
@RestController @PreAuthorize("hasRole('BACKOFFICE')") public class UtentiController extends TableController{ @Override public ResponseEntity<?> page(@RequestBody ObjectNode json, Pageable pageable, Authentication authentication) throws ApplicationException { return super.page(json, pageable, authentication); } }
解决方法2:自定义带继承特性的权限注解
由于原生@PreAuthorize没有@Inherited元注解,无法通过类继承传递权限规则,我们可以自定义一个包含@Inherited的注解来实现类级权限的继承:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited @PreAuthorize("hasRole('BACKOFFICE')") public @interface BackofficeAuthorized {}
之后在基类或派生类上使用这个自定义注解,继承的方法会自动应用注解中的权限规则:
@RestController @BackofficeAuthorized public abstract class TableController { // 基类方法会自动继承权限规则 } @RestController @BackofficeAuthorized public class UtentiController extends TableController{ // 派生类自身方法和继承的方法都会生效 }
解决方法3:统一使用方法级注解
如果不想依赖类级注解的继承特性,直接在基类的方法上添加@PreAuthorize(这也是你已经验证有效的方式),派生类若需要不同权限,只需重写方法并覆盖注解即可。
配置确认
你的SecurityConfiguration已经正确开启了方法级安全(@EnableGlobalMethodSecurity(prePostEnabled = true)),无需调整基础配置。
内容的提问来源于stack exchange,提问作者Roberto Petrilli
相关产品推荐
相关产品推荐

