此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

从 2.0 版开始,Spring Security 大大改进了对向服务层方法添加安全性的支持。 它提供了对 JSR-250 注解安全性以及框架原始注解的支持。 从 3.0 开始,您还可以使用新的基于表达式的注释。 您可以通过使用元素来修饰 Bean 声明来将安全性应用于单个 Bean,也可以使用 AspectJ 样式的切入点来保护整个服务层中的多个 Bean。@Securedintercept-methodsSpring中文文档

EnableMethodSecurity

在 Spring Security 5.6 中,我们可以在任何实例上使用注解来启用基于注解的安全性。@EnableMethodSecurity@ConfigurationSpring中文文档

这在许多方面得到了改进。:@EnableGlobalMethodSecurity@EnableMethodSecuritySpring中文文档

  1. 使用简化的 API,而不是元数据源、配置属性、决策管理器和投票者。 这简化了重用和自定义。AuthorizationManagerSpring中文文档

  2. 支持直接基于 Bean 的配置,而不需要扩展来定制 BeanGlobalMethodSecurityConfigurationSpring中文文档

  3. 使用原生 Spring AOP 构建,删除抽象并允许您使用 Spring AOP 构建块进行自定义Spring中文文档

  4. 检查冲突的注释,以确保明确的安全配置Spring中文文档

  5. 符合JSR-250Spring中文文档

  6. 默认启用 、 、 和@PreAuthorize@PostAuthorize@PreFilter@PostFilterSpring中文文档

对于早期版本,请阅读 @EnableGlobalMethodSecurity 的类似支持。Spring中文文档

例如,以下命令将启用 Spring Security 的注解:@PreAuthorizeSpring中文文档

方法安全配置
@Configuration
@EnableMethodSecurity
public class MethodSecurityConfig {
	// ...
}
@Configuration
@EnableMethodSecurity
class MethodSecurityConfig {
	// ...
}
<sec:method-security/>

然后,向方法(在类或接口上)添加注释将相应地限制对该方法的访问。 Spring Security 的本机注解支持为该方法定义了一组属性。 这些将传递给它做出实际决定:DefaultAuthorizationMethodInterceptorChainSpring中文文档

方法安全注释用法
public interface BankService {
	@PreAuthorize("hasRole('USER')")
	Account readAccount(Long id);

	@PreAuthorize("hasRole('USER')")
	List<Account> findAccounts();

	@PreAuthorize("hasRole('TELLER')")
	Account post(Account account, Double amount);
}
interface BankService {
	@PreAuthorize("hasRole('USER')")
	fun readAccount(id : Long) : Account

	@PreAuthorize("hasRole('USER')")
	fun findAccounts() : List<Account>

	@PreAuthorize("hasRole('TELLER')")
	fun post(account : Account, amount : Double) : Account
}

您可以使用以下方法启用对 Spring Security 注解的支持:@SecuredSpring中文文档

@Secured配置
@Configuration
@EnableMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig {
	// ...
}
@Configuration
@EnableMethodSecurity(securedEnabled = true)
class MethodSecurityConfig {
	// ...
}
<sec:method-security secured-enabled="true"/>

或 JSR-250 使用:Spring中文文档

JSR-250 配置
@Configuration
@EnableMethodSecurity(jsr250Enabled = true)
public class MethodSecurityConfig {
	// ...
}
@Configuration
@EnableMethodSecurity(jsr250Enabled = true)
class MethodSecurityConfig {
	// ...
}
<sec:method-security jsr250-enabled="true"/>

自定义授权

Spring Security 的 、 、 和 附带了丰富的基于表达式的支持。@PreAuthorize@PostAuthorize@PreFilter@PostFilterSpring中文文档

如果需要自定义表达式的处理方式,可以公开自定义 ,如下所示:MethodSecurityExpressionHandlerSpring中文文档

自定义 MethodSecurityExpressionHandler
@Bean
static MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
	DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
	handler.setTrustResolver(myCustomTrustResolver);
	return handler;
}
companion object {
	@Bean
	fun methodSecurityExpressionHandler() : MethodSecurityExpressionHandler {
		val handler = DefaultMethodSecurityExpressionHandler();
		handler.setTrustResolver(myCustomTrustResolver);
		return handler;
	}
}
<sec:method-security>
	<sec:expression-handler ref="myExpressionHandler"/>
</sec:method-security>

<bean id="myExpressionHandler"
		class="org.springframework.security.messaging.access.expression.DefaultMessageSecurityExpressionHandler">
	<property name="trustResolver" ref="myCustomTrustResolver"/>
</bean>

我们公开使用一种方法来确保 Spring 在初始化 Spring Security 的方法安全类之前发布它MethodSecurityExpressionHandlerstatic@ConfigurationSpring中文文档

此外,对于基于角色的授权,Spring Security 添加了一个默认前缀,用于评估 .ROLE_hasRoleSpring中文文档

您可以通过公开 Bean 来配置授权规则以使用不同的前缀,如下所示:GrantedAuthorityDefaultsSpring中文文档

自定义 MethodSecurityExpressionHandler
@Bean
static GrantedAuthorityDefaults grantedAuthorityDefaults() {
	return new GrantedAuthorityDefaults("MYPREFIX_");
}
companion object {
	@Bean
	fun grantedAuthorityDefaults() : GrantedAuthorityDefaults {
		return GrantedAuthorityDefaults("MYPREFIX_");
	}
}
<sec:method-security/>

<bean id="grantedAuthorityDefaults" class="org.springframework.security.config.core.GrantedAuthorityDefaults">
	<constructor-arg value="MYPREFIX_"/>
</bean>

我们公开使用一种方法来确保 Spring 在初始化 Spring Security 的方法安全类之前发布它GrantedAuthorityDefaultsstatic@ConfigurationSpring中文文档

自定义授权管理器

方法授权是方法前授权和方法后授权的组合。Spring中文文档

在调用方法之前执行方法授权。 如果该授权拒绝访问,则不会调用该方法,并抛出 an。 在调用方法之后,但在方法返回给调用方之前执行方法后授权。 如果该授权拒绝访问,则不会返回该值,并抛出AccessDeniedExceptionAccessDeniedExceptionSpring中文文档

若要重新创建默认情况下添加的功能,请发布以下配置:@EnableMethodSecuritySpring中文文档

完整的前后方法安全配置
@Configuration
@EnableMethodSecurity(prePostEnabled = false)
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	Advisor preFilterAuthorizationMethodInterceptor() {
		return new PreFilterAuthorizationMethodInterceptor();
	}

	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	Advisor preAuthorizeAuthorizationMethodInterceptor() {
		return AuthorizationManagerBeforeMethodInterceptor.preAuthorize();
	}

	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	Advisor postAuthorizeAuthorizationMethodInterceptor() {
		return AuthorizationManagerAfterMethodInterceptor.postAuthorize();
	}

	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	Advisor postFilterAuthorizationMethodInterceptor() {
		return new PostFilterAuthorizationMethodInterceptor();
	}
}
@Configuration
@EnableMethodSecurity(prePostEnabled = false)
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun preFilterAuthorizationMethodInterceptor() : Advisor {
		return PreFilterAuthorizationMethodInterceptor();
	}

	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun preAuthorizeAuthorizationMethodInterceptor() : Advisor {
		return AuthorizationManagerBeforeMethodInterceptor.preAuthorize();
	}

	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun postAuthorizeAuthorizationMethodInterceptor() : Advisor {
		return AuthorizationManagerAfterMethodInterceptor.postAuthorize();
	}

	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun postFilterAuthorizationMethodInterceptor() : Advisor {
		return PostFilterAuthorizationMethodInterceptor();
	}
}
<sec:method-security pre-post-enabled="false"/>

<aop:config/>

<bean id="preFilterAuthorizationMethodInterceptor"
		class="org.springframework.security.authorization.method.PreFilterAuthorizationMethodInterceptor"/>
<bean id="preAuthorizeAuthorizationMethodInterceptor"
		class="org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor"
		factory-method="preAuthorize"/>
<bean id="postAuthorizeAuthorizationMethodInterceptor"
		class="org.springframework.security.authorization.method.AuthorizationManagerAfterMethodInterceptor"
		factory-method="postAuthorize"/>
<bean id="postFilterAuthorizationMethodInterceptor"
		class="org.springframework.security.authorization.method.PostFilterAuthorizationMethodInterceptor"/>

请注意,Spring Security 的方法安全性是使用 Spring AOP 构建的。 因此,拦截器是根据指定的顺序调用的。 这可以通过调用拦截器实例来自定义,如下所示:setOrderSpring中文文档

发布自定义顾问
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
Advisor postFilterAuthorizationMethodInterceptor() {
	PostFilterAuthorizationMethodInterceptor interceptor = new PostFilterAuthorizationMethodInterceptor();
	interceptor.setOrder(AuthorizationInterceptorOrders.POST_AUTHORIZE.getOrder() - 1);
	return interceptor;
}
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
fun postFilterAuthorizationMethodInterceptor() : Advisor {
	val interceptor = PostFilterAuthorizationMethodInterceptor();
	interceptor.setOrder(AuthorizationInterceptorOrders.POST_AUTHORIZE.getOrder() - 1);
	return interceptor;
}
<bean id="postFilterAuthorizationMethodInterceptor"
		class="org.springframework.security.authorization.method.PostFilterAuthorizationMethodInterceptor">
	<property name="order"
			value="#{T(org.springframework.security.authorization.method.AuthorizationInterceptorsOrder).POST_AUTHORIZE.getOrder() -1}"/>
</bean>

您可能只想在应用程序中提供支持,在这种情况下,您可以执行以下操作:@PreAuthorizeSpring中文文档

仅@PreAuthorize配置
@Configuration
@EnableMethodSecurity(prePostEnabled = false)
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	Advisor preAuthorize() {
		return AuthorizationManagerBeforeMethodInterceptor.preAuthorize();
	}
}
@Configuration
@EnableMethodSecurity(prePostEnabled = false)
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun preAuthorize() : Advisor {
		return AuthorizationManagerBeforeMethodInterceptor.preAuthorize()
	}
}
<sec:method-security pre-post-enabled="false"/>

<aop:config/>

<bean id="preAuthorizeAuthorizationMethodInterceptor"
	class="org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor"
	factory-method="preAuthorize"/>

或者,您可能有一个要添加到列表中的自定义 before-方法。AuthorizationManagerSpring中文文档

在这种情况下,您需要告诉 Spring Security 您的授权管理器应用的方法和类以及适用于哪些方法和类。AuthorizationManagerSpring中文文档

因此,您可以将 Spring Security 配置为在两者之间调用您的 in 和如下:AuthorizationManager@PreAuthorize@PostAuthorizeSpring中文文档

Custom Before Advisor(顾问前定制)
@Configuration
@EnableMethodSecurity
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public Advisor customAuthorize() {
		JdkRegexpMethodPointcut pattern = new JdkRegexpMethodPointcut();
		pattern.setPattern("org.mycompany.myapp.service.*");
		AuthorizationManager<MethodInvocation> rule = AuthorityAuthorizationManager.isAuthenticated();
		AuthorizationManagerBeforeMethodInterceptor interceptor = new AuthorizationManagerBeforeMethodInterceptor(pattern, rule);
		interceptor.setOrder(AuthorizationInterceptorsOrder.PRE_AUTHORIZE_ADVISOR_ORDER.getOrder() + 1);
		return interceptor;
    }
}
@Configuration
@EnableMethodSecurity
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun customAuthorize() : Advisor {
		val pattern = JdkRegexpMethodPointcut();
		pattern.setPattern("org.mycompany.myapp.service.*");
		val rule = AuthorityAuthorizationManager.isAuthenticated();
		val interceptor = AuthorizationManagerBeforeMethodInterceptor(pattern, rule);
		interceptor.setOrder(AuthorizationInterceptorsOrder.PRE_AUTHORIZE_ADVISOR_ORDER.getOrder() + 1);
		return interceptor;
	}
}
<sec:method-security/>

<aop:config/>

<bean id="customAuthorize"
		class="org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor">
	<constructor-arg>
		<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
			<property name="pattern" value="org.mycompany.myapp.service.*"/>
		</bean>
	</constructor-arg>
	<constructor-arg>
		<bean class="org.springframework.security.authorization.AuthorityAuthorizationManager"
				factory-method="isAuthenticated"/>
	</constructor-arg>
	<property name="order"
			value="#{T(org.springframework.security.authorization.method.AuthorizationInterceptorsOrder).PRE_AUTHORIZE_ADVISOR_ORDER.getOrder() + 1}"/>
</bean>

您可以使用 中指定的顺序常量将拦截器放置在 Spring Security 方法拦截器之间。AuthorizationInterceptorsOrderSpring中文文档

对于方法后授权也可以执行相同的操作。 方法后授权通常涉及分析返回值以验证访问。Spring中文文档

例如,您可能有一种方法可以确认请求的帐户实际上属于登录用户,如下所示:Spring中文文档

@PostAuthorize例子
public interface BankService {

	@PreAuthorize("hasRole('USER')")
	@PostAuthorize("returnObject.owner == authentication.name")
	Account readAccount(Long id);
}
interface BankService {

	@PreAuthorize("hasRole('USER')")
	@PostAuthorize("returnObject.owner == authentication.name")
	fun readAccount(id : Long) : Account
}

您可以提供自己的数据来自定义如何评估对返回值的访问。AuthorizationMethodInterceptorSpring中文文档

例如,如果您有自己的自定义注解,则可以按如下方式进行配置:Spring中文文档

自定义后顾问
@Configuration
@EnableMethodSecurity
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public Advisor customAuthorize(AuthorizationManager<MethodInvocationResult> rules) {
		AnnotationMatchingPointcut pattern = new AnnotationMatchingPointcut(MySecurityAnnotation.class);
		AuthorizationManagerAfterMethodInterceptor interceptor = new AuthorizationManagerAfterMethodInterceptor(pattern, rules);
		interceptor.setOrder(AuthorizationInterceptorsOrder.POST_AUTHORIZE_ADVISOR_ORDER.getOrder() + 1);
		return interceptor;
	}
}
@Configuration
@EnableMethodSecurity
class MethodSecurityConfig {
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	fun customAuthorize(rules : AuthorizationManager<MethodInvocationResult>) : Advisor {
		val pattern = AnnotationMatchingPointcut(MySecurityAnnotation::class.java);
		val interceptor = AuthorizationManagerAfterMethodInterceptor(pattern, rules);
		interceptor.setOrder(AuthorizationInterceptorsOrder.POST_AUTHORIZE_ADVISOR_ORDER.getOrder() + 1);
		return interceptor;
	}
}
<sec:method-security/>

<aop:config/>

<bean id="customAuthorize"
		class="org.springframework.security.authorization.method.AuthorizationManagerAfterMethodInterceptor">
	<constructor-arg>
		<bean class="org.springframework.aop.support.annotation.AnnotationMethodMatcher">
			<constructor-arg value="#{T(org.mycompany.MySecurityAnnotation)}"/>
		</bean>
	</constructor-arg>
	<constructor-arg>
		<bean class="org.springframework.security.authorization.AuthorityAuthorizationManager"
				factory-method="isAuthenticated"/>
	</constructor-arg>
	<property name="order"
		value="#{T(org.springframework.security.authorization.method.AuthorizationInterceptorsOrder).PRE_AUTHORIZE_ADVISOR_ORDER.getOrder() + 1}"/>
</bean>

它将在拦截器之后被调用。@PostAuthorizeSpring中文文档

对于早期版本,请阅读 @EnableGlobalMethodSecurity 的类似支持。Spring中文文档

我们公开使用一种方法来确保 Spring 在初始化 Spring Security 的方法安全类之前发布它MethodSecurityExpressionHandlerstatic@ConfigurationSpring中文文档

我们公开使用一种方法来确保 Spring 在初始化 Spring Security 的方法安全类之前发布它GrantedAuthorityDefaultsstatic@ConfigurationSpring中文文档

在调用方法之前执行方法授权。 如果该授权拒绝访问,则不会调用该方法,并抛出 an。 在调用方法之后,但在方法返回给调用方之前执行方法后授权。 如果该授权拒绝访问,则不会返回该值,并抛出AccessDeniedExceptionAccessDeniedExceptionSpring中文文档

您可以使用 中指定的顺序常量将拦截器放置在 Spring Security 方法拦截器之间。AuthorizationInterceptorsOrderSpring中文文档

EnableGlobalMethodSecurity

我们可以通过在任何实例上使用注释来启用基于注释的安全性。 以下示例启用 Spring Security 的注解:@EnableGlobalMethodSecurity@Configuration@SecuredSpring中文文档

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig {
// ...
}
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
open class MethodSecurityConfig {
	// ...
}

然后,向方法(在类或接口上)添加注释将相应地限制对该方法的访问。 Spring Security 的本机注解支持为该方法定义了一组属性。 这些将传递给它以做出实际决定:AccessDecisionManagerSpring中文文档

public interface BankService {

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account[] findAccounts();

@Secured("ROLE_TELLER")
public Account post(Account account, double amount);
}
interface BankService {
    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    fun readAccount(id: Long): Account

    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    fun findAccounts(): Array<Account>

    @Secured("ROLE_TELLER")
    fun post(account: Account, amount: Double): Account
}

可以通过以下方式启用对 JSR-250 注释的支持:Spring中文文档

@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled = true)
public class MethodSecurityConfig {
// ...
}
@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled = true)
open class MethodSecurityConfig {
	// ...
}

这些是基于标准的,允许应用简单的基于角色的约束,但没有 Spring Security 的本机注释。 若要使用基于表达式的新语法,可以使用:Spring中文文档

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig {
// ...
}
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
open class MethodSecurityConfig {
	// ...
}

等效的 Java 代码为:Spring中文文档

public interface BankService {

@PreAuthorize("isAnonymous()")
public Account readAccount(Long id);

@PreAuthorize("isAnonymous()")
public Account[] findAccounts();

@PreAuthorize("hasAuthority('ROLE_TELLER')")
public Account post(Account account, double amount);
}
interface BankService {
    @PreAuthorize("isAnonymous()")
    fun readAccount(id: Long): Account

    @PreAuthorize("isAnonymous()")
    fun findAccounts(): Array<Account>

    @PreAuthorize("hasAuthority('ROLE_TELLER')")
    fun post(account: Account, amount: Double): Account
}

GlobalMethodSecurity配置

有时,您可能需要执行比注释更复杂的操作。 对于这些实例,您可以扩展 ,确保批注存在于您的子类上。 例如,如果要提供自定义 ,可以使用以下配置:@EnableGlobalMethodSecurityGlobalMethodSecurityConfiguration@EnableGlobalMethodSecurityMethodSecurityExpressionHandlerSpring中文文档

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
	@Override
	protected MethodSecurityExpressionHandler createExpressionHandler() {
		// ... create and return custom MethodSecurityExpressionHandler ...
		return expressionHandler;
	}
}
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
open class MethodSecurityConfig : GlobalMethodSecurityConfiguration() {
    override fun createExpressionHandler(): MethodSecurityExpressionHandler {
        // ... create and return custom MethodSecurityExpressionHandler ...
        return expressionHandler
    }
}

有关可重写的方法的其他信息,请参阅 GlobalMethodSecurityConfiguration 类的 Javadoc。Spring中文文档

<global-method-security>元素

此元素用于在应用程序中启用基于批注的安全性(通过在元素上设置适当的属性),并将应用于整个应用程序上下文的安全切入声明组合在一起。 您只应声明一个元素。 以下声明支持 Spring Security 的:<global-method-security>@SecuredSpring中文文档

<global-method-security secured-annotations="enabled" />

然后,向方法(在类或接口上)添加注释将相应地限制对该方法的访问。 Spring Security 的本机注解支持为该方法定义了一组属性。 这些被传递给它,让它做出实际决定。 以下示例显示了典型接口中的批注:AccessDecisionManager@SecuredSpring中文文档

public interface BankService {

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account readAccount(Long id);

@Secured("IS_AUTHENTICATED_ANONYMOUSLY")
public Account[] findAccounts();

@Secured("ROLE_TELLER")
public Account post(Account account, double amount);
}
interface BankService {
    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    fun readAccount(id: Long): Account

    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    fun findAccounts(): Array<Account>

    @Secured("ROLE_TELLER")
    fun post(account: Account, amount: Double): Account
}

可以通过以下方式启用对 JSR-250 注释的支持:Spring中文文档

<global-method-security jsr250-annotations="enabled" />

这些是基于标准的,允许应用简单的基于角色的约束,但它们不具有 Spring Security 的本机注释功能。 若要使用基于表达式的语法,请使用:Spring中文文档

<global-method-security pre-post-annotations="enabled" />

等效的 Java 代码为:Spring中文文档

public interface BankService {

@PreAuthorize("isAnonymous()")
public Account readAccount(Long id);

@PreAuthorize("isAnonymous()")
public Account[] findAccounts();

@PreAuthorize("hasAuthority('ROLE_TELLER')")
public Account post(Account account, double amount);
}
interface BankService {
    @PreAuthorize("isAnonymous()")
    fun readAccount(id: Long): Account

    @PreAuthorize("isAnonymous()")
    fun findAccounts(): Array<Account>

    @PreAuthorize("hasAuthority('ROLE_TELLER')")
    fun post(account: Account, amount: Double): Account
}

如果您需要定义简单的规则,而不仅仅是根据用户的授权列表检查角色名称,那么基于表达式的注释是一个不错的选择。Spring中文文档

注释的方法只会被定义为 Spring Bean 的实例(在启用方法安全性的同一应用程序上下文中)受到保护。 如果要保护不是由 Spring 创建的实例(例如,使用运算符),则需要使用 AspectJ。newSpring中文文档

您可以在同一个应用程序中启用多种类型的注释,但任何接口或类都只能使用一种类型,否则行为将无法得到很好的定义。 如果找到两个适用于特定方法的注释,则只会应用其中一个注释。Spring中文文档

注释的方法只会被定义为 Spring Bean 的实例(在启用方法安全性的同一应用程序上下文中)受到保护。 如果要保护不是由 Spring 创建的实例(例如,使用运算符),则需要使用 AspectJ。newSpring中文文档

您可以在同一个应用程序中启用多种类型的注释,但任何接口或类都只能使用一种类型,否则行为将无法得到很好的定义。 如果找到两个适用于特定方法的注释,则只会应用其中一个注释。Spring中文文档

使用 protect-pointcut 添加 Security Pointcuts

protect-pointcut特别强大,因为它允许您仅通过简单的声明将安全性应用于许多 Bean。 请看以下示例:Spring中文文档

<global-method-security>
<protect-pointcut expression="execution(* com.mycompany.*Service.*(..))"
	access="ROLE_USER"/>
</global-method-security>

d. 此配置保护在应用程序上下文中声明的 Bean 上的所有方法,这些 Bean 的类位于包中且类名以 结尾。 只有具有该角色的用户才能调用这些方法。 与 URL 匹配一样,最具体的匹配项必须排在切点列表的第一位,因为使用第一个匹配表达式。 安全批注优先于切点。com.mycompanyServiceROLE_USERSpring中文文档