[英]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
的相應方法並從超類添加/修改值來添加自定義MethodSecurityMetadataSource
和AccessDecisionVoter
。
@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.