方法安全
<method-security>
该元素是Spring Security中为方法提供安全支持的主要方式。可以通过使用注解(在接口或类级别定义)或定义一组切入点来保护方法。
<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中为方法提供安全支持的主要方式。可以通过使用注解(在接口或类级别定义)或通过使用AspectJ语法定义一组切入点作为子元素来保护方法。
<global-method-security> 属性
<global-method-security> 已被弃用,推荐使用 <method-security>。如果您需要使用 <global-method-security>,请在构建配置中包含 spring-security-access 依赖。
-
access-decision-manager-ref 方法安全使用与Web安全相同的
AccessDecisionManager配置,但可以使用此属性进行覆盖。默认情况下,使用一个基于 Affirmative 策略的实现,并包含一个 RoleVoter 和一个 AuthenticatedVoter。 -
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关于接口注解不继承的规则。这意味着在接口上定义的Security注解方法将不会受到安全保护。因此,在使用AspectJ时,您必须将Security注解放置在类上。
-
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"。
<global-method-security> 的子元素
<after-invocation-provider>
此元素可用于装饰 AfterInvocationProvider,以供 <global-method-security> 命名空间维护的安全拦截器使用。您可以在 global-method-security 元素内定义零个或多个此类元素,每个元素均需包含指向应用程序上下文中 AfterInvocationProvider Bean 实例的 ref 属性。
<after-invocation-provider> 的父元素
<after-invocation-provider> 属性
<after-invocation-provider> 已被弃用,建议使用 <method-security> 和 @PostFilter 与 @PostAuthorize。如果你仍需使用 <after-invocation-provider>,请在构建配置中包含 spring-security-access 依赖,同时计划迁移到更现代的方案。
- 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> 已被弃用,推荐使用 <method-security> 和 @PostFilter 与 @PostAuthorize。如果你仍需使用 <invocation-attribute-factory>,请在构建配置中包含 spring-security-access 依赖,并计划迁移到更现代的方案。
<invocation-attribute-factory> 的父元素
<invocation-attribute-factory> 属性
- ref 定义对 Spring bean Id 的引用。
<post-invocation-advice>
为 <pre-post-annotation-handling> 元素自定义 PostInvocationAdviceProvider,将引用设置为 PostInvocationAuthorizationAdvice。
<post-invocation-advice> 已弃用,推荐使用 <method-security> 和 @PostFilter 与 @PostAuthorize。如果你仍需使用 <post-invocation-advice>,请在构建配置中包含 spring-security-access 依赖,并计划迁移到更现代的选项。
<post-invocation-advice> 的父元素
<post-invocation-advice> 属性
- ref 定义对 Spring bean Id 的引用。
<pre-invocation-advice>
为 <pre-post-annotation-handling> 元素自定义 PreInvocationAuthorizationAdviceVoter,将其引用设置为 PreInvocationAuthorizationAdviceVoter。
<pre-invocation-advice> 已弃用,推荐使用 <method-security> 和 @PreFilter 与 @PreAuthorize。如果你需要使用 <pre-invocation-advice>,请在构建配置中包含 spring-security-access 依赖,同时计划迁移到现代选项。
<pre-invocation-advice> 的父元素
<pre-invocation-advice> 属性
- ref 定义对Spring bean Id的引用。
使用 {#nsa-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> 已被弃用,建议使用 <method-security>。如果您仍需使用 <method-security-metadata-source>,请在构建配置中包含 spring-security-access 依赖项,同时计划迁移到更现代的选项。
<method-security-metadata-source> 属性
-
id 一个bean标识符,用于在上下文的其他地方引用该bean。
-
use-expressions 启用<intercept-url>元素中'access'属性的表达式使用,而非传统的配置属性列表。默认为'false'。如果启用,每个属性应包含一个布尔表达式。如果表达式计算结果为'true',则允许访问。
<method-security-metadata-source> 的子元素
<protect>
定义一个受保护的方法以及适用于它的访问控制配置属性。我们强烈建议您不要将 "protect" 声明与任何通过 "global-method-security" 提供的服务混合使用。
<protect> 的父元素
<protect> 属性
-
access 应用于该方法的访问配置属性列表,例如 "ROLE_A,ROLE_B"。
-
method 方法名称