Spring 安全注释的排序

Ordering of Spring Security annotations

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

例如,它是注释定义的顺序,还是固定的,例如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();

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

详述 here,方法安全拦截器在找到第一个支持的注解后停止。

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

it's intentional that DelegatingMethodSecurityMetadataSource only uses one source of metadata, the first which returns a non-null result

顺序是@PreAuthorize@Secured@RolesAllowed。因此问题中的方法一和方法二实际上等同于

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

@Secured 注释被静默忽略。