【问题标题】:Ordering of Spring Security annotationsSpring Security 注释的排序
【发布时间】:2021-04-21 00:17:14
【问题描述】:

如果一个方法有多个安全注解,它们的应用顺序是什么?

例如,它是定义注释的顺序,还是固定的,例如SecuredAnnotationSecurityMetadataSource 总是在PrePostAnnotationSecurityMetadataSource 之前使用?

换句话说,调用这些方法时的评估顺序是什么?

@Secured("ROLE_ADMIN")
@PreAuthorize("hasPermission(#target, 'read')")
void method1();

@PreAuthorize("hasPermission(#target, 'read')")
@Secured("ROLE_ADMIN")
void method2();

@PreAuthorize("hasRole('ADMIN') && hasPermission(#target, 'read')")
void method3();

@PreAuthorize("hasPermission(#target, 'read') && hasRole('ADMIN')")
void method4();

【问题讨论】:

  • 投反对票的理由很好。有什么可以改进的?

标签: java spring spring-security aop spring-4


【解决方案1】:

tl;dr:混合使用 @Secured@PreAuthorize 不起作用

详细here,一旦找到第一个支持的注解,方法安全拦截器就会停止。

for (MethodSecurityMetadataSource s : methodSecurityMetadataSources) {
    attributes = s.getAttributes(method, targetClass);
    if (attributes != null && !attributes.isEmpty()) {
        break;
    }
}

有意DelegatingMethodSecurityMetadataSource 只使用一个元数据源,第一个返回非空结果

订购是@PreAuthorize@Secured@RolesAllowed。因此问题中的方法一和方法二实际上等价于

@PreAuthorize("hasPermission(#target, 'read')")
void method();

@Secured 注释被忽略。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2015-12-19
    • 2012-09-26
    • 2015-05-06
    • 1970-01-01
    • 2014-05-11
    • 2014-08-22
    • 2011-07-16
    • 2021-09-27
    相关资源
    最近更新 更多