|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright 2002-2018 the original author or authors.
|
|
|
+ * Copyright 2002-2022 the original author or authors.
|
|
|
*
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -21,9 +21,11 @@ import org.apache.commons.logging.LogFactory;
|
|
|
import org.w3c.dom.Element;
|
|
|
|
|
|
import org.springframework.aop.config.AopNamespaceUtils;
|
|
|
+import org.springframework.beans.BeanMetadataElement;
|
|
|
import org.springframework.beans.BeansException;
|
|
|
import org.springframework.beans.factory.FactoryBean;
|
|
|
import org.springframework.beans.factory.config.BeanDefinition;
|
|
|
+import org.springframework.beans.factory.config.RuntimeBeanReference;
|
|
|
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
|
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
|
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
|
@@ -41,6 +43,9 @@ import org.springframework.security.authorization.method.PreAuthorizeAuthorizati
|
|
|
import org.springframework.security.authorization.method.PreFilterAuthorizationMethodInterceptor;
|
|
|
import org.springframework.security.config.Elements;
|
|
|
import org.springframework.security.config.core.GrantedAuthorityDefaults;
|
|
|
+import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
+import org.springframework.security.core.context.SecurityContextHolderStrategy;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
import org.springframework.util.xml.DomUtils;
|
|
|
|
|
|
/**
|
|
@@ -61,26 +66,33 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
|
|
|
private static final String ATT_REF = "ref";
|
|
|
|
|
|
+ private static final String ATT_SECURITY_CONTEXT_HOLDER_STRATEGY_REF = "security-context-holder-strategy-ref";
|
|
|
+
|
|
|
@Override
|
|
|
public BeanDefinition parse(Element element, ParserContext pc) {
|
|
|
CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(),
|
|
|
pc.extractSource(element));
|
|
|
pc.pushContainingComponent(compositeDef);
|
|
|
+ BeanMetadataElement securityContextHolderStrategy = getSecurityContextHolderStrategy(element);
|
|
|
boolean prePostAnnotationsEnabled = !element.hasAttribute(ATT_USE_PREPOST)
|
|
|
|| "true".equals(element.getAttribute(ATT_USE_PREPOST));
|
|
|
if (prePostAnnotationsEnabled) {
|
|
|
BeanDefinitionBuilder preFilterInterceptor = BeanDefinitionBuilder
|
|
|
.rootBeanDefinition(PreFilterAuthorizationMethodInterceptor.class)
|
|
|
- .setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
|
|
+ .setRole(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
+ .addPropertyValue("securityContextHolderStrategy", securityContextHolderStrategy);
|
|
|
BeanDefinitionBuilder preAuthorizeInterceptor = BeanDefinitionBuilder
|
|
|
.rootBeanDefinition(PreAuthorizeAuthorizationMethodInterceptor.class)
|
|
|
- .setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
|
|
+ .setRole(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
+ .addPropertyValue("securityContextHolderStrategy", securityContextHolderStrategy);
|
|
|
BeanDefinitionBuilder postAuthorizeInterceptor = BeanDefinitionBuilder
|
|
|
.rootBeanDefinition(PostAuthorizeAuthorizationMethodInterceptor.class)
|
|
|
- .setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
|
|
+ .setRole(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
+ .addPropertyValue("securityContextHolderStrategy", securityContextHolderStrategy);
|
|
|
BeanDefinitionBuilder postFilterInterceptor = BeanDefinitionBuilder
|
|
|
.rootBeanDefinition(PostFilterAuthorizationMethodInterceptor.class)
|
|
|
- .setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
|
|
+ .setRole(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
+ .addPropertyValue("securityContextHolderStrategy", securityContextHolderStrategy);
|
|
|
Element expressionHandlerElt = DomUtils.getChildElementByTagName(element, Elements.EXPRESSION_HANDLER);
|
|
|
if (expressionHandlerElt != null) {
|
|
|
String expressionHandlerRef = expressionHandlerElt.getAttribute(ATT_REF);
|
|
@@ -110,7 +122,9 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
if (securedEnabled) {
|
|
|
BeanDefinitionBuilder securedInterceptor = BeanDefinitionBuilder
|
|
|
.rootBeanDefinition(AuthorizationManagerBeforeMethodInterceptor.class)
|
|
|
- .setRole(BeanDefinition.ROLE_INFRASTRUCTURE).setFactoryMethod("secured");
|
|
|
+ .setRole(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
+ .addPropertyValue("securityContextHolderStrategy", securityContextHolderStrategy)
|
|
|
+ .setFactoryMethod("secured");
|
|
|
pc.getRegistry().registerBeanDefinition("securedAuthorizationMethodInterceptor",
|
|
|
securedInterceptor.getBeanDefinition());
|
|
|
}
|
|
@@ -118,7 +132,8 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
if (jsr250Enabled) {
|
|
|
BeanDefinitionBuilder jsr250Interceptor = BeanDefinitionBuilder
|
|
|
.rootBeanDefinition(Jsr250AuthorizationMethodInterceptor.class)
|
|
|
- .setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
|
|
+ .setRole(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
+ .addPropertyValue("securityContextHolderStrategy", securityContextHolderStrategy);
|
|
|
pc.getRegistry().registerBeanDefinition("jsr250AuthorizationMethodInterceptor",
|
|
|
jsr250Interceptor.getBeanDefinition());
|
|
|
}
|
|
@@ -127,6 +142,14 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ private BeanMetadataElement getSecurityContextHolderStrategy(Element methodSecurityElmt) {
|
|
|
+ String holderStrategyRef = methodSecurityElmt.getAttribute(ATT_SECURITY_CONTEXT_HOLDER_STRATEGY_REF);
|
|
|
+ if (StringUtils.hasText(holderStrategyRef)) {
|
|
|
+ return new RuntimeBeanReference(holderStrategyRef);
|
|
|
+ }
|
|
|
+ return BeanDefinitionBuilder.rootBeanDefinition(SecurityContextHolderStrategyFactory.class).getBeanDefinition();
|
|
|
+ }
|
|
|
+
|
|
|
public static final class MethodSecurityExpressionHandlerBean
|
|
|
implements FactoryBean<MethodSecurityExpressionHandler>, ApplicationContextAware {
|
|
|
|
|
@@ -158,11 +181,17 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
public static final class Jsr250AuthorizationMethodInterceptor
|
|
|
implements FactoryBean<AuthorizationManagerBeforeMethodInterceptor>, ApplicationContextAware {
|
|
|
|
|
|
+ private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
|
|
|
+ .getContextHolderStrategy();
|
|
|
+
|
|
|
private final Jsr250AuthorizationManager manager = new Jsr250AuthorizationManager();
|
|
|
|
|
|
@Override
|
|
|
public AuthorizationManagerBeforeMethodInterceptor getObject() {
|
|
|
- return AuthorizationManagerBeforeMethodInterceptor.jsr250(this.manager);
|
|
|
+ AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor
|
|
|
+ .jsr250(this.manager);
|
|
|
+ interceptor.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
|
|
|
+ return interceptor;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -181,16 +210,26 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) {
|
|
|
+ this.securityContextHolderStrategy = securityContextHolderStrategy;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public static final class PreAuthorizeAuthorizationMethodInterceptor
|
|
|
implements FactoryBean<AuthorizationManagerBeforeMethodInterceptor> {
|
|
|
|
|
|
+ private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
|
|
|
+ .getContextHolderStrategy();
|
|
|
+
|
|
|
private final PreAuthorizeAuthorizationManager manager = new PreAuthorizeAuthorizationManager();
|
|
|
|
|
|
@Override
|
|
|
public AuthorizationManagerBeforeMethodInterceptor getObject() {
|
|
|
- return AuthorizationManagerBeforeMethodInterceptor.preAuthorize(this.manager);
|
|
|
+ AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor
|
|
|
+ .preAuthorize(this.manager);
|
|
|
+ interceptor.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
|
|
|
+ return interceptor;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -198,6 +237,10 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
return AuthorizationManagerBeforeMethodInterceptor.class;
|
|
|
}
|
|
|
|
|
|
+ public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) {
|
|
|
+ this.securityContextHolderStrategy = securityContextHolderStrategy;
|
|
|
+ }
|
|
|
+
|
|
|
public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandler) {
|
|
|
this.manager.setExpressionHandler(expressionHandler);
|
|
|
}
|
|
@@ -207,11 +250,17 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
public static final class PostAuthorizeAuthorizationMethodInterceptor
|
|
|
implements FactoryBean<AuthorizationManagerAfterMethodInterceptor> {
|
|
|
|
|
|
+ private SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder
|
|
|
+ .getContextHolderStrategy();
|
|
|
+
|
|
|
private final PostAuthorizeAuthorizationManager manager = new PostAuthorizeAuthorizationManager();
|
|
|
|
|
|
@Override
|
|
|
public AuthorizationManagerAfterMethodInterceptor getObject() {
|
|
|
- return AuthorizationManagerAfterMethodInterceptor.postAuthorize(this.manager);
|
|
|
+ AuthorizationManagerAfterMethodInterceptor interceptor = AuthorizationManagerAfterMethodInterceptor
|
|
|
+ .postAuthorize(this.manager);
|
|
|
+ interceptor.setSecurityContextHolderStrategy(this.securityContextHolderStrategy);
|
|
|
+ return interceptor;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -219,10 +268,28 @@ public class MethodSecurityBeanDefinitionParser implements BeanDefinitionParser
|
|
|
return AuthorizationManagerAfterMethodInterceptor.class;
|
|
|
}
|
|
|
|
|
|
+ public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy securityContextHolderStrategy) {
|
|
|
+ this.securityContextHolderStrategy = securityContextHolderStrategy;
|
|
|
+ }
|
|
|
+
|
|
|
public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandler) {
|
|
|
this.manager.setExpressionHandler(expressionHandler);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+ static class SecurityContextHolderStrategyFactory implements FactoryBean<SecurityContextHolderStrategy> {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SecurityContextHolderStrategy getObject() throws Exception {
|
|
|
+ return SecurityContextHolder.getContextHolderStrategy();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Class<?> getObjectType() {
|
|
|
+ return SecurityContextHolderStrategy.class;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|