@PreAuthorize 注解组合

@PreAuthorize annotations combining

我使用几个 @PreAuthorize-base 注释来保护我的 REST API 方法。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasRole('ROLE_A') or hasRole('ROLE_B')")
public @interface ForAorB {
}

同时我还有

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasRole('ROLE_A')")
public @interface ForA {
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasRole('ROLE_B')")
public @interface ForB {
}

我的 @PreAuthorize 表达式比简单的 hasRole('ROLE_x) 复杂一点,我不想在 @ForA@ForB 和 [=19] 中将它们加倍=].

是否可以基于 @ForA@ForB 创建 @ForAorB 注释而不是 @PreAuthorize("hasRole('ROLE_A') or hasRole('ROLE_B')") 中的表达式加倍?

我试过了,但看起来像

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@ForA @ForB
public @interface ForAorB {
}

实际上作为 @ForAandB 但不是 @ForAorB

那行不通,因为注释(至少在这种情况下)是 "additive"。单个 @PreAuthorize 注释将为您提供 OK 或 NOK,并且无论任何其他可能的身份验证注释如何,它都决定了整个结果。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@ForA @ForB
public @interface ForAorB {
}

相同
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasRole('ROLE_A')")
@PreAuthorize("hasRole('ROLE_B')")
public @interface ForAorB {
}

所以对于 AND 它可以工作,但是你不能让它与 OR 一起工作,除非手写 @PreAuthorize 注释。