方法安全

<method-security>

此元素是为 Spring Security bean 上的保护方法添加支持的主要方法。可以使用注释(在接口或类级别定义)或定义一组切入点来保护方法。

<method-security> 属性

  • pre-post-enabled 为此应用程序上下文启用 Spring Security 的预调用和后调用注释(@PreFilter、@PreAuthorize、@PostFilter、@PostAuthorize)。默认为“true”。

  • secured-enabled 为此应用程序上下文启用 Spring Security 的 @Secured 注释。默认为“false”。

  • jsr250-enabled 为此应用程序上下文启用 JSR-250 授权注释(@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 语法定义一组切入点作为子元素来进行保护。

<global-method-security> 属性

  • access-decision-manager-ref 方法安全使用与 Web 安全相同的 AccessDecisionManager 配置,但可以使用此属性覆盖它。默认情况下,使用带有 RoleVoter 和 AuthenticatedVoter 的 AffirmativeBased 实现。

  • authentication-manager-ref 对应用于方法安全的 AuthenticationManager 的引用。

  • jsr250-annotations 指定是否使用 JSR-250 样式属性(例如“RolesAllowed”)。这将需要类路径上的 javax.annotation.security 类。将此设置为 true 还会向 AccessDecisionManager 添加一个 Jsr250Voter,因此您需要确保在使用自定义实现并希望使用这些注释时执行此操作。

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

  • mode 此属性可以设置为“aspectj”以指定应使用 AspectJ 而不是默认的 Spring AOP。安全方法必须使用 spring-security-aspects 模块中的 AnnotationSecurityAspect 进行编织。

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

  • order 允许为方法安全拦截器设置建议“顺序”。

  • pre-post-annotations 指定是否为该应用程序上下文启用 Spring Security 的前置和后置调用注释(@PreFilter、@PreAuthorize、@PostFilter、@PostAuthorize)。默认值为“disabled”。

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

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

  • secured-annotations 指定是否为该应用程序上下文启用 Spring Security 的 @Secured 注释。默认值为“disabled”。

<after-invocation-provider>

此元素可用于装饰 AfterInvocationProvider 以供由 <global-method-security> 命名空间维护的安全拦截器使用。您可以在 global-method-security 元素中定义零个或多个这些元素,每个元素都具有一个 ref 属性,该属性指向应用程序上下文中的 AfterInvocationProvider bean 实例。

<after-invocation-provider> 的父元素

<after-invocation-provider> 属性

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

<pre-post-annotation-handling>

允许完全替换处理 Spring Security 的前置和后置调用注释(@PreFilter、@PreAuthorize、@PostFilter、@PostAuthorize)的默认基于表达式的机制。仅在启用这些注释时适用。

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

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

<invocation-attribute-factory>

定义 PrePostInvocationAttributeFactory 实例,该实例用于从带注释的方法生成前置和后置调用元数据。

<invocation-attribute-factory> 的父元素

<invocation-attribute-factory> 属性

  • ref 定义对 Spring bean ID 的引用。

<post-invocation-advice>

使用 ref 作为 PostInvocationAuthorizationAdvice 为 <pre-post-annotation-handling> 元素定制 PostInvocationAdviceProvider

<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 的引用。

使用 <protect-pointcut> 保护方法

<protect-pointcut> 而不是使用 @Secured 注解在单个方法或类基础上定义安全属性,您可以使用 <protect-pointcut> 元素在服务层中定义跨越整个方法集和接口的跨切安全约束。您可以在 命名空间介绍 中找到一个示例。

<protect-pointcut> 的父元素

<protect-pointcut> 属性

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

  • expression 一个 AspectJ 表达式,包括 execution 关键字。例如,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,由创建的方法安全拦截器使用。

<intercept-methods> 的子元素

<method-security-metadata-source>

创建一个 MethodSecurityMetadataSource 实例

<method-security-metadata-source> 属性

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

  • use-expressions 启用在 <intercept-url> 元素中的 'access' 属性中使用表达式,而不是传统的配置属性列表。默认值为 'false'。如果启用,每个属性应包含单个布尔表达式。如果表达式计算结果为 'true',则授予访问权限。

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

<protect>

定义一个受保护的方法以及应用于该方法的访问控制配置属性。我们强烈建议您不要将 "protect" 声明与 "global-method-security" 提供的任何服务混合使用。

<protect> 属性

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

  • method 方法名称