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
注释被静默忽略。
如果一个方法有多个安全注释,它们的应用顺序是什么?
例如,它是注释定义的顺序,还是固定的,例如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
注释被静默忽略。