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

问题描述 投票:1回答:3

我想在类中使用自定义注释标记方法,该注释将使用spring安全性来控制授权决策。例如:

@Role("ADMIN")
public void accessControlledMethod(){}

我理解这意味着我需要注册我的自定义注释“Role”,以便当ConfigAttributes做出授权决定时,它可以导致AccessDecisionManager存在。但是,我不明白如何使用spring security注册我的自定义注释,以便识别它。

我在框架代码中看到了一个可能的解决方案。有一个名为SecuredAnnotationSecurityMetadataSource的类,其文档说“为自定义注释注入AnnotationMetadataExtractor”。如果这是首选方法,我不知道如何配置SecuredAnnotationSecurityMetadataSource或如何将AnnotationMetadataExtractor注入其中。

java spring spring-security annotations
3个回答
4
投票

您可以在配置中扩展GlobalMethodSecurityConfiguration

@EnableGlobalMethodSecurity
@Configuration
public class MyMethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() {
        return SecuredAnnotationSecurityMetadataSource(...);
    }    
}

在xml中,您可以:

<global-method-security metadata-source-ref="customMethodSecurityMetadataSource">
...
</global-method-security>
<bean id="customMethodSecurityMetadataSource"  class="org.springframework.security.access.annotation.SecuredAnnotationSecurityMetadataSource">
...
</bean>

customMethodSecurityMetadataSource可以是MethodSecurityMetadataSource的任何实例


1
投票

这在Spring 5中不起作用,因为默认情况下禁用默认bean覆盖。它仅适用于设置为spring.main.allow-bean-definition-overridingtrue属性。

如果有人知道如何在没有bean覆盖启用的情况下将自定义MethodSecurityMetadataSource添加到GlobalMethodSecurityConfiguration,那么对于较新的Spring版本将会有所帮助


0
投票

在Spring Boot中,您可以通过覆盖MethodSecurityMetadataSource中的相应方法并添加/修改超类中的值来添加自定义AccessDecisionVoters和GlobalMethodSecurityConfigurations。

@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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.