# 方法安全性

## \<method-security\>

这个元素是在 Spring Security bean 上添加对方法安全的支持的主要手段。方法可以通过使用注释（在接口或类级别上定义）或通过定义一组切入点来保护。

### \<method-security\>属性

* **pre-post-enabled **为此应用程序上下文启用 Spring Security 的 pre 和 post 调用注释（@prefilter、@preauthorize、@postfilter、@postauthorize）。默认值为“true”。

* **安全启用**为此应用程序上下文启用 Spring Security 的 @Secured 注释。默认为“false”。

* **支持 JSR250**为此应用程序上下文启用 JSR-250 授权注释（@roleslowled，@permitall，@denyall）。默认为“false”。

* **代理-目标-类**如果为真，将使用基于类的代理，而不是基于接口的代理。默认为“false”。

### \<method-security\>的子元素

* [表达式处理程序](http.html#nsa-expression-handler)

## \<global-method-security\>

这个元素是在 Spring Security bean 上添加对方法安全的支持的主要手段。方法可以通过使用注释（在接口或类级别定义）或使用 AspectJ 语法将一组切入点定义为子元素来保护。

### \<global-method-security\>属性

* **access-decision-manager-ref **Method Security 使用与 Web Security 相同的`AccessDecisionManager`配置，但是可以使用此属性重写此配置。默认情况下，基于确认的实现用于 RoleVoter 和 AuthentidVoter。

* **认证-管理器-ref **对方法安全性应该使用的`AuthenticationManager`的引用。

* **JSR250-注释**指定是否使用 JSR-250 样式属性（例如“允许滚动”）。这将需要 Classpath 上的 javax.annotation.security 类。将此设置为 true 还会为`Jsr250Voter`添加`AccessDecisionManager`，因此，如果你正在使用自定义实现并希望使用这些注释，则需要确保执行此操作。

* **元数据-源-参考**可以提供一个外部`MethodSecurityMetadataSource`实例，该实例将优先于其他源（例如默认注释）。

* **模式**此属性可以设置为“AspectJ”，以指定应该使用 AspectJ，而不是默认的 Spring  AOP。安全方法必须与`spring-security-aspects`模块中的`AnnotationSecurityAspect`交织在一起。

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

* **秩序**允许为方法安全性拦截器设置通知“order”。

* **pre-post 注释**指定是否应为此应用程序上下文启用 Spring Security 的 pre 和 post 调用注释（@prefilter、@preauthorize、@postfilter、@postauthorize）。默认值为“禁用”。

* **代理-目标-类**如果为真，将使用基于类的代理，而不是基于接口的代理。

* **Run-as-manager-ref **对可选`RunAsManager`实现的引用，该实现将由配置的`MethodSecurityInterceptor`使用

* **安全注释**指定是否应为此应用程序上下文启用 Spring Security 的 @Secured 注释。默认值为“禁用”。

### \<global-method-security\>的子元素

* [后调用-提供者](#nsa-after-invocation-provider)

* [表达式处理程序](http.html#nsa-expression-handler)

* [后注解前处理](#nsa-pre-post-annotation-handling)

* [保护切入点](#nsa-protect-pointcut)

## \<after-invocation-provider\>

这个元素可以用来装饰`AfterInvocationProvider`，以便由`<global-method-security>`命名空间维护的安全拦截器使用。你可以在`global-method-security`元素中定义零个或更多个，每个元素都有一个`ref`属性，指向应用程序上下文中的`AfterInvocationProvider` Bean 实例。

### \<after-invocation-provider\>的父元素

* [全局方法安全性](#nsa-global-method-security)

### \<after-invocation-provider\>属性

* **参考**定义了对实现`AfterInvocationProvider`的 Spring  Bean 的引用。

## \<pre-post-annotation-handling\>

允许完全替换用于处理 Spring 安全性的 pre 和 post 调用注释（@prefilter、@preauthorize、@postfilter、@postauthorize）的缺省基于表达式的机制。仅在启用了这些注释的情况下才会应用。

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

* [全局方法安全性](#nsa-global-method-security)

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

* [调用-属性-工厂](#nsa-invocation-attribute-factory)

* [调用后-建议](#nsa-post-invocation-advice)

* [调用前的建议](#nsa-pre-invocation-advice)

## \<invocation-attribute-factory\>

定义 prepostinvocationAttributeFactory 实例，该实例用于从带注释的方法生成 pre 和 post 调用元数据。

### \<invocation-attribute-factory\>的父元素

* [后注解前处理](#nsa-pre-post-annotation-handling)

### \<invocation-attribute-factory\>属性

* **参考**定义了对 Spring  Bean ID 的引用。

## \<post-invocation-advice\>

将`PostInvocationAdviceProvider`与 ref 一起定制为 \`PostInvocationAuthorizationAdvice`元素的`PostInvocationAuthorizationAdvice`。

### \<post-invocation-advice\>的父元素

* [后注解前处理](#nsa-pre-post-annotation-handling)

### \<post-invocation-advice\>属性

* **参考**定义了对 Spring  Bean ID 的引用。

## \<pre-invocation-advice\>

将`PreInvocationAuthorizationAdviceVoter`与 ref 一起定制为 \`PreInvocationAuthorizationAdviceVoter`元素的`PreInvocationAuthorizationAdviceVoter`。

### \<pre-invocation-advice\>的父元素

* [后注解前处理](#nsa-pre-post-annotation-handling)

### \<pre-invocation-advice\>属性

* **参考**定义了对 Spring  Bean ID 的引用。

## 使用固定方法

`<protect-pointcut>`不是使用`@Secured`注释在单个方法或类的基础上定义安全属性，而是可以使用`<protect-pointcut>`元素在服务层中的整个方法和接口集合中定义跨领域的安全约束。你可以在[命名空间介绍](../../authorization/method-security.html#ns-protect-pointcut)中找到一个示例。

### \<protect-pointcut\>的父元素

* [全局方法安全性](#nsa-global-method-security)

### \<protect-pointcut\>属性

* **访问**Access Configuration Attributes 列表，该列表应用于匹配切入点的所有方法，例如“role\_a，role\_b”

* **表达式**AspectJ 表达式，包括`execution`关键字。例如，`execution(int com.foo.TargetObject.countLength(String))`。

## \<intercept-methods\>

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

### \<intercept-methods\>属性

* **access-decision-manager-ref **可选的 AccessDecisionManager Bean ID 将被创建的方法安全拦截器使用。

### \<intercept-methods\>的子元素

* [protect](#nsa-protect)

## \<method-security-metadata-source\>

创建一个 MethodSecurityMetaDataSource 实例

### \<method-security-metadata-source\>属性

* **身份证** Bean 标识符，用于在上下文的其他地方引用 Bean。

* **使用表达式**允许在 \<intercept-url\>元素中的“access”属性中使用表达式，而不是使用传统的配置属性列表。默认为“false”。如果启用，每个属性应该包含一个布尔表达式。如果表达式计算为“true”，则将授予访问权限。

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

* [protect](#nsa-protect)

## \<protect\>

定义受保护的方法和应用于该方法的访问控制配置属性。我们强烈建议你不要将“protect”声明与“global-method-security”提供的任何服务混为一谈。

### \<protect\>的父元素

* [截取方法](#nsa-intercept-methods)

* [方法-安全性-元数据-源](#nsa-method-security-metadata-source)

### \<protect\>属性

* **访问**访问应用于该方法的配置属性列表，例如“role\_a，role\_b”。

* **方法**一个方法名

[网络安全](http.html)[LDAP 安全性](ldap.html)

