Method Security

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

<method-security>

这个元素是增加对Spring Security Bean上的方法的安全支持的主要手段。方法可以通过使用注解(在接口或类级别上定义)或定义一组指向性指令来保证安全。

<method-security> 属性

  • pre-post-enabled 为该application context启用Spring Security的 pre 和 post 调用注解(@PreFilter@PreAuthorize@PostFilter@PostAuthorize)。默认为 "true"。

  • secured-enabled 为该application context启用Spring Security的 @Secured 注解。默认为 "false"。

  • jsr250-enabled 为这个 application context 启用 JSR-250 authorization 注解(@RolesAllowed, @PermitAll, @DenyAll)。默认为 "false"。

  • mode 如果设置为 "aspectj",则使用 AspectJ 来拦截方法调用

  • proxy-target-class 如果为 true,将使用基于类的代理,而不是基于接口的代理。默认为 "false"。

  • security-context-holder-strategy-ref 指定在检索 SecurityContext 时要使用的 SecurityContextHolderStrategy。默认为 SecurityContextHolder.getContextHolderStrategy() 返回的值。

  • observation-registry-ref 对用于"`FilterChain` 和相关组件的 ObservationRegistry 的引用。

<method-security> 子元素

<global-method-security>

该元素是增加对 Spring Security Bean 上的方法安全支持的主要手段。方法可以通过使用注解(在接口或类级别上定义)或使用AspectJ语法定义一组作为子元素的pointcuts来实现安全。

<global-method-security> 属性

  • access-decision-manager-ref 方法安全使用与Web安全相同的 AccessDecisionManager 配置,但这可以用这个属性来重写。默认情况下,一个 AffirmativeBased 实现被用于一个 RoleVoter 和一个 AuthenticatedVoter

  • authentication-manager-refAuthenticationManager 的引用,它应该被用于方法安全(method security)。

  • jsr250-annotations 指定是否要使用JSR-250风格的属性(例如 "RolesAllowed")。这将需要classpath上的 javax.annotation.security 类。将此设置为 "true" 也会给 AccessDecisionManager 添加一个 Jsr250Voter,所以如果你使用一个自定义的实现并想使用这些注解,你需要确保你这样做。

  • metadata-source-ref 可以提供一个外部 MethodSecurityMetadataSource 实例,它将优先于其他来源(如默认注解)。

  • mode 这个属性可以被设置为 "aspectj",以指定使用AspectJ而不是默认的Spring AOP。安全的方法必须被 spring-security-aspects 模块中的 AnnotationSecurityAspect 织入。

    需要注意的是,AspectJ遵循Java的规则,即接口上的注解不被继承。这意味着在接口上定义了Security注解的方法将不会被保护。相反,在使用AspectJ时,你必须将Security注解放在类上。

  • order 允许为方法安全拦截器设置建议 "order"(顺序)。

  • pre-post-annotations 指定是否应为此 application context 启用Spring Security的 pre 和 post 调用注解(@PreFilter@PreAuthorize@PostFilter@PostAuthorize)的使用。默认为 "disabled"。

  • proxy-target-class 如果为真,将使用基于类的代理,而不是基于接口的代理。

  • run-as-manager-ref 对一个可选的 RunAsManager 实现的引用,它将被配置的 MethodSecurityInterceptor 使用。

  • secured-annotations 指定是否应该为该 application context 启用 Spring Security 的 @Secured 注解的使用。默认为 "disabled"。

<after-invocation-provider>

这个元素可以用来装饰 AfterInvocationProvider,供 <global-method-security> 命名空间所维护的安全拦截器使用。你可以在 global-method-security 元素中定义零个或多个这样的元素,每个元素都有一个 ref 属性,指向你的application context中的 AfterInvocationProvider Bean 实例。

<after-invocation-provider> 的父元素

<after-invocation-provider> 属性

  • ref 定义了对实现 AfterInvocationProvider 的 Spring Bean 的引用。

<pre-post-annotation-handling>

允许完全取代默认的基于表达式的机制来处理 Spring Security 的 pre 和 post 调用注解(@PreFilter@PreAuthorize@PostFilter@PostAuthorize)。仅在这些注解被启用时适用。

<pre-post-annotation-handling> 的父元素

<pre-post-annotation-handling> 的子元素

<invocation-attribute-factory>

定义 PrePostInvocationAttributeFactory 实例,该实例用于从被注解的方法中生成 pre 和 post 调用元数据。

<invocation-attribute-factory> 的父元素

<invocation-attribute-factory> 属性

  • ref 定义了对 Spring Bean Id 的引用。

<post-invocation-advice>

自定义 PostInvocationAdviceProvider,其引用为 <pre-post-annotation-handling> 元素的 PostInvocationAuthorizationAdvice

<post-invocation-advice> 的父元素

<post-invocation-advice> 属性

  • ref 定义了一个对 Spring Bean Id 的引用。

<pre-invocation-advice>

ref 自定义 PreInvocationAuthorizationAdviceVoter,作为 <pre-post-annotation-handling> 元素的 PreInvocationAuthorizationAdviceVoter

<pre-invocation-advice> 的父元素

<pre-invocation-advice> 属性

  • ref 定义了一个对 Spring Bean Id 的引用。

Securing Methods 的使用

<protect-pointcut> <protect-pointcut> 与使用 @Secured 注解在单个方法或类的基础上定义安全属性不同,你可以使用 <protect-pointcut> 元素在服务层中的整组方法和接口上定义交叉的安全约束。你可以在 命名空间介绍 中找到一个例子。

<protect-pointcut> 的父元素

<protect-pointcut> 属性

  • access access 配置属性列表,适用于所有与该切点匹配的方法,例如 "ROLE_A,ROLE_B"

  • expression 一个AspectJ表达式,包括执行关键字。例如,execution(int com.foo.TargetObject.countLength(String))。

<intercept-methods>

可以在Bean定义中使用,为Bean添加一个安全拦截器,并为Bean的方法设置访问配置属性。

<intercept-methods> 属性

  • use-authorization-manager 使用 AuthorizationManager API而不是 AccessDecisionManager(默认为 true)。

  • authorization-manager-ref 可选的 AuthorizationManager bean ID,用于代替默认值(取代 use-authorization-manager)。

  • access-decision-manager-ref 可选的 AccessDecisionManager Bean ID,将被创建的方法安全拦截器(security interceptor)使用。

<intercept-methods> 子元素

<method-security-metadata-source>

创建一个 MethodSecurityMetadataSource 实例。

<method-security-metadata-source> 属性

  • id 一个Bean标识符,用于在 context 中引用该Bean的其他地方。

  • use-expressions 启用 <intercept-url> 元素中 'access' 属性中的表达式,而不是传统的配置属性列表。默认为 "false"。如果启用,每个属性应该包含一个布尔表达式。如果表达式评估为 "true",将被授予访问权。

<method-security-metadata-source> 子元素

<protect>

定义了一个受保护的方法和适用于它的访问控制配置属性。我们强烈建议你不要把 "protect" 声明与任何提供 "global-method-security" 的服务混在一起。

<protect> 属性

  • access 适用于该方法的 access 配置属性列表,例如 "ROLE_A,ROLE_B"。

  • method 方法名称。