Java 在spring security中使用自定义方法安全性注释
我想用一个自定义注释标记类中的方法,该注释将使用SpringSecurity控制授权决策。例如:Java 在spring security中使用自定义方法安全性注释,java,spring,spring-security,annotations,Java,Spring,Spring Security,Annotations,我想用一个自定义注释标记类中的方法,该注释将使用SpringSecurity控制授权决策。例如: @Role("ADMIN") public void accessControlledMethod(){} 我理解这意味着我需要以某种方式注册我的自定义注释“角色”,以便在AccessDecisionManager做出授权决策时,ConfigAttributes出现。但是,我不明白如何向spring security注册我的自定义注释以使其被识别 我在框架代码中看到了一个潜在的解决方案。有一个名为
@Role("ADMIN")
public void accessControlledMethod(){}
我理解这意味着我需要以某种方式注册我的自定义注释“角色”,以便在AccessDecisionManager
做出授权决策时,ConfigAttributes
出现。但是,我不明白如何向spring security注册我的自定义注释以使其被识别
我在框架代码中看到了一个潜在的解决方案。有一个名为SecuredAnotationSecurityMetadataSource的类,其文档中说“为自定义注释注入AnnotationMetadataExtractor”。如果这是首选方法,我不确定如何配置SecuredAnnotationSecurityMetadataSource或如何将AnnotationMetadataExtractor注入其中。您可以在配置中扩展
GlobalMethodSecurityConfiguration
:
在xml中,您可以执行以下操作:
...
...
customMethodSecurityMetadataSource可以是MethodSecurityMetadataSource的任何实例这在Spring 5中不起作用,因为默认情况下禁用了默认bean重写。它仅适用于
spring.main.allow bean definition overriding
属性设置为true
如果有人知道如何在不启用bean覆盖的情况下将自定义
MethodSecurityMetadataSource
添加到GlobalMethodSecurityConfiguration
,它将对较新的Spring版本有所帮助。在Spring Boot中,您可以通过覆盖GlobalMethodSecurityConfiguration
中的相应方法并添加/修改超类中的值来添加自定义MethodSecurityMetadataSource
s和AccessDecisionVoter
s
@Configuration
@AutoConfigureAfter(SecurityConfiguration.class)
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
@Override
public MethodSecurityMetadataSource methodSecurityMetadataSource() {
var source = (DelegatingMethodSecurityMetadataSource) super.methodSecurityMetadataSource();
source.getMethodSecurityMetadataSources().add(new FooSecurityMetadataSource());
return source;
}
@Override
protected AccessDecisionManager accessDecisionManager() {
var manager = (AffirmativeBased) super.accessDecisionManager();
manager.getDecisionVoters().add(new FooVoter());
return manager;
}
}
您使用自定义命名而不是Spring Security提供的命名有什么原因吗?@XtremeBiker我的团队有一个现有的授权框架,该框架使用特定于我们应用程序的不同命名约定。我想在我们的方法安全注释中使用这些角色名称。方法文档清楚地说明了这一点,但我找不到关于它如何工作的任何信息。感谢您的回复。我目前正在使用XML配置,是否有等效的XML配置?谢谢,我不小心列出了错误的XSD,它说不支持元数据源引用。哎哟。另外,我应该注意,这个全局方法安全配置应该在servlet.xml配置中,而不是在security.xml配置中。刚刚偶然发现这个问题,请尝试我的答案。
<global-method-security metadata-source-ref="customMethodSecurityMetadataSource">
...
</global-method-security>
<bean id="customMethodSecurityMetadataSource" class="org.springframework.security.access.annotation.SecuredAnnotationSecurityMetadataSource">
...
</bean>
@Configuration
@AutoConfigureAfter(SecurityConfiguration.class)
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
@Override
public MethodSecurityMetadataSource methodSecurityMetadataSource() {
var source = (DelegatingMethodSecurityMetadataSource) super.methodSecurityMetadataSource();
source.getMethodSecurityMetadataSources().add(new FooSecurityMetadataSource());
return source;
}
@Override
protected AccessDecisionManager accessDecisionManager() {
var manager = (AffirmativeBased) super.accessDecisionManager();
manager.getDecisionVoters().add(new FooVoter());
return manager;
}
}