Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在spring security中使用自定义方法安全性注释_Java_Spring_Spring Security_Annotations - Fatal编程技术网

Java 在spring security中使用自定义方法安全性注释

Java 在spring security中使用自定义方法安全性注释,java,spring,spring-security,annotations,Java,Spring,Spring Security,Annotations,我想用一个自定义注释标记类中的方法,该注释将使用SpringSecurity控制授权决策。例如: @Role("ADMIN") public void accessControlledMethod(){} 我理解这意味着我需要以某种方式注册我的自定义注释“角色”,以便在AccessDecisionManager做出授权决策时,ConfigAttributes出现。但是,我不明白如何向spring security注册我的自定义注释以使其被识别 我在框架代码中看到了一个潜在的解决方案。有一个名为

我想用一个自定义注释标记类中的方法,该注释将使用SpringSecurity控制授权决策。例如:

@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;
    }
}