簡體   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