繁体   English   中英

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

[英]Using custom method security annotation in spring security

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

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

我知道这意味着我需要以某种方式注册我的自定义批注“ Role”,以便在AccessDecisionManager做出授权决定时可以导致ConfigAttributes存在。 但是,我不了解如何在spring安全性中注册我的自定义注释,以便其被识别。

我在框架代码中看到了一个潜在的解决方案。 有一个称为SecuredAnnotationSecurityMetadataSource的类,其文档显示为“为自定义注释注入AnnotationMetadataExtractor”。 如果那是首选方法,则不确定如何配置SecuredAnnotationSecurityMetadataSource或如何将AnnotationMetadataExtractor注入其中。

您可以在配置中扩展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的任何实例

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

如果有人对如何在不启用Bean覆盖启用的情况下将自定义MethodSecurityMetadataSource添加到GlobalMethodSecurityConfiguration有所了解,它将对较新的Spring版本有所帮助

在Spring Boot中,您可以通过覆盖GlobalMethodSecurityConfiguration的相应方法并从超类添加/修改值来添加自定义MethodSecurityMetadataSourceAccessDecisionVoter

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM