【问题标题】:@PreAuthorize annotations combining@PreAuthorize 注释组合
【发布时间】:2019-09-18 16:55:48
【问题描述】:

我使用几个 @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 和@ForAorB 中将它们加倍。

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

我试过了,但看起来像

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

实际上是 @ForAandB 但不是 @ForAorB

【问题讨论】:

    标签: java spring spring-security annotations


    【解决方案1】:

    这是行不通的,因为注释(至少在这种情况下)是“附加的”。单个 @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 注释。

    【讨论】:

    • 很遗憾,@PreAuthorize 不能重复。
    • @AndriyKryvtsun 嗯?我说的是为什么它永远不会对OR 起作用。你不能让它工作,所以手写注释。
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2014-05-25
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多