mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-07-13 13:53:29 +00:00
SEC-1164: Further registering on bean components for tooling and removal of global ids.
This commit is contained in:
parent
b387d63aba
commit
b4bb489638
@ -67,14 +67,6 @@ public class GlobalMethodSecurityBeanDefinitionParser implements BeanDefinitionP
|
|||||||
|
|
||||||
private final Log logger = LogFactory.getLog(getClass());
|
private final Log logger = LogFactory.getLog(getClass());
|
||||||
|
|
||||||
/*
|
|
||||||
* Internal Bean IDs which are only used within this class
|
|
||||||
*/
|
|
||||||
// static final String SECURITY_INTERCEPTOR_ID = "_globalMethodSecurityInterceptor";
|
|
||||||
static final String ACCESS_MANAGER_ID = "_globalMethodSecurityAccessManager";
|
|
||||||
// private static final String DELEGATING_METHOD_DEFINITION_SOURCE_ID = "_delegatingMethodSecurityMetadataSource";
|
|
||||||
private static final String EXPRESSION_HANDLER_ID = "_methodExpressionHandler";
|
|
||||||
|
|
||||||
private static final String ATT_ACCESS = "access";
|
private static final String ATT_ACCESS = "access";
|
||||||
private static final String ATT_EXPRESSION = "expression";
|
private static final String ATT_EXPRESSION = "expression";
|
||||||
private static final String ATT_ACCESS_MGR = "access-decision-manager-ref";
|
private static final String ATT_ACCESS_MGR = "access-decision-manager-ref";
|
||||||
@ -134,10 +126,11 @@ public class GlobalMethodSecurityBeanDefinitionParser implements BeanDefinitionP
|
|||||||
if (StringUtils.hasText(expressionHandlerRef)) {
|
if (StringUtils.hasText(expressionHandlerRef)) {
|
||||||
logger.info("Using bean '" + expressionHandlerRef + "' as method ExpressionHandler implementation");
|
logger.info("Using bean '" + expressionHandlerRef + "' as method ExpressionHandler implementation");
|
||||||
} else {
|
} else {
|
||||||
pc.getRegistry().registerBeanDefinition(EXPRESSION_HANDLER_ID, new RootBeanDefinition(DefaultMethodSecurityExpressionHandler.class));
|
BeanDefinition expressionHandler = new RootBeanDefinition(DefaultMethodSecurityExpressionHandler.class);
|
||||||
|
expressionHandlerRef = pc.getReaderContext().registerWithGeneratedName(expressionHandler);
|
||||||
|
pc.registerBeanComponent(new BeanComponentDefinition(expressionHandler, expressionHandlerRef));
|
||||||
logger.warn("Expressions were enabled for method security but no SecurityExpressionHandler was configured. " +
|
logger.warn("Expressions were enabled for method security but no SecurityExpressionHandler was configured. " +
|
||||||
"All hasPermision() expressions will evaluate to false.");
|
"All hasPermision() expressions will evaluate to false.");
|
||||||
expressionHandlerRef = EXPRESSION_HANDLER_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BeanDefinitionBuilder expressionPreAdviceBldr = BeanDefinitionBuilder.rootBeanDefinition(ExpressionBasedPreInvocationAdvice.class);
|
BeanDefinitionBuilder expressionPreAdviceBldr = BeanDefinitionBuilder.rootBeanDefinition(ExpressionBasedPreInvocationAdvice.class);
|
||||||
@ -189,8 +182,7 @@ public class GlobalMethodSecurityBeanDefinitionParser implements BeanDefinitionP
|
|||||||
String accessManagerId = element.getAttribute(ATT_ACCESS_MGR);
|
String accessManagerId = element.getAttribute(ATT_ACCESS_MGR);
|
||||||
|
|
||||||
if (!StringUtils.hasText(accessManagerId)) {
|
if (!StringUtils.hasText(accessManagerId)) {
|
||||||
registerAccessManager(pc, jsr250Enabled, preInvocationVoter);
|
accessManagerId = registerAccessManager(pc, jsr250Enabled, preInvocationVoter);
|
||||||
accessManagerId = ACCESS_MANAGER_ID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String runAsManagerId = element.getAttribute(ATT_RUN_AS_MGR);
|
String runAsManagerId = element.getAttribute(ATT_RUN_AS_MGR);
|
||||||
@ -208,9 +200,10 @@ public class GlobalMethodSecurityBeanDefinitionParser implements BeanDefinitionP
|
|||||||
/**
|
/**
|
||||||
* Register the default AccessDecisionManager. Adds the special JSR 250 voter jsr-250 is enabled and an
|
* Register the default AccessDecisionManager. Adds the special JSR 250 voter jsr-250 is enabled and an
|
||||||
* expression voter if expression-based access control is enabled.
|
* expression voter if expression-based access control is enabled.
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private void registerAccessManager(ParserContext pc, boolean jsr250Enabled, BeanDefinition expressionVoter) {
|
private String registerAccessManager(ParserContext pc, boolean jsr250Enabled, BeanDefinition expressionVoter) {
|
||||||
|
|
||||||
BeanDefinitionBuilder accessMgrBuilder = BeanDefinitionBuilder.rootBeanDefinition(AffirmativeBased.class);
|
BeanDefinitionBuilder accessMgrBuilder = BeanDefinitionBuilder.rootBeanDefinition(AffirmativeBased.class);
|
||||||
ManagedList voters = new ManagedList(4);
|
ManagedList voters = new ManagedList(4);
|
||||||
@ -227,7 +220,11 @@ public class GlobalMethodSecurityBeanDefinitionParser implements BeanDefinitionP
|
|||||||
|
|
||||||
accessMgrBuilder.addPropertyValue("decisionVoters", voters);
|
accessMgrBuilder.addPropertyValue("decisionVoters", voters);
|
||||||
|
|
||||||
pc.getRegistry().registerBeanDefinition(ACCESS_MANAGER_ID, accessMgrBuilder.getBeanDefinition());
|
BeanDefinition accessManager = accessMgrBuilder.getBeanDefinition();
|
||||||
|
String id = pc.getReaderContext().registerWithGeneratedName(accessManager);
|
||||||
|
pc.registerBeanComponent(new BeanComponentDefinition(accessManager, id));
|
||||||
|
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
@ -208,7 +208,7 @@ public class GlobalMethodSecurityBeanDefinitionParserTests {
|
|||||||
@Test
|
@Test
|
||||||
public void expressionVoterAndAfterInvocationProviderUseSameExpressionHandlerInstance() throws Exception {
|
public void expressionVoterAndAfterInvocationProviderUseSameExpressionHandlerInstance() throws Exception {
|
||||||
setContext("<global-method-security pre-post-annotations='enabled'/>" + AUTH_PROVIDER_XML);
|
setContext("<global-method-security pre-post-annotations='enabled'/>" + AUTH_PROVIDER_XML);
|
||||||
AffirmativeBased adm = (AffirmativeBased) appContext.getBean(GlobalMethodSecurityBeanDefinitionParser.ACCESS_MANAGER_ID);
|
AffirmativeBased adm = (AffirmativeBased) appContext.getBeansOfType(AffirmativeBased.class).values().toArray()[0];
|
||||||
List voters = (List) FieldUtils.getFieldValue(adm, "decisionVoters");
|
List voters = (List) FieldUtils.getFieldValue(adm, "decisionVoters");
|
||||||
PreInvocationAuthorizationAdviceVoter mev = (PreInvocationAuthorizationAdviceVoter) voters.get(0);
|
PreInvocationAuthorizationAdviceVoter mev = (PreInvocationAuthorizationAdviceVoter) voters.get(0);
|
||||||
MethodSecurityMetadataSourceAdvisor msi = (MethodSecurityMetadataSourceAdvisor)
|
MethodSecurityMetadataSourceAdvisor msi = (MethodSecurityMetadataSourceAdvisor)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user