Add SecurityContextHolderStrategy XML Configuration for Messaging
Issue gh-11061
This commit is contained in:
@@ -25,6 +25,7 @@ import org.w3c.dom.Element;
|
||||
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.PropertyValue;
|
||||
import org.springframework.beans.factory.FactoryBean;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanReference;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
@@ -50,6 +51,8 @@ import org.springframework.security.authorization.AuthorizationDecision;
|
||||
import org.springframework.security.authorization.AuthorizationManager;
|
||||
import org.springframework.security.config.Elements;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.core.context.SecurityContextHolderStrategy;
|
||||
import org.springframework.security.messaging.access.expression.ExpressionBasedMessageSecurityMetadataSourceFactory;
|
||||
import org.springframework.security.messaging.access.expression.MessageAuthorizationContextSecurityExpressionHandler;
|
||||
import org.springframework.security.messaging.access.expression.MessageExpressionVoter;
|
||||
@@ -118,6 +121,8 @@ public final class WebSocketMessageBrokerSecurityBeanDefinitionParser implements
|
||||
|
||||
private static final String AUTHORIZATION_MANAGER_REF_ATTR = "authorization-manager-ref";
|
||||
|
||||
private static final String SECURITY_CONTEXT_HOLDER_STRATEGY_REF_ATTR = "security-context-holder-strategy-ref";
|
||||
|
||||
private static final String PATTERN_ATTR = "pattern";
|
||||
|
||||
private static final String ACCESS_ATTR = "access";
|
||||
@@ -170,6 +175,16 @@ public final class WebSocketMessageBrokerSecurityBeanDefinitionParser implements
|
||||
BeanDefinitionBuilder inboundChannelSecurityInterceptor = BeanDefinitionBuilder
|
||||
.rootBeanDefinition(AuthorizationChannelInterceptor.class);
|
||||
inboundChannelSecurityInterceptor.addConstructorArgReference(mdsId);
|
||||
String holderStrategyRef = element.getAttribute(SECURITY_CONTEXT_HOLDER_STRATEGY_REF_ATTR);
|
||||
if (StringUtils.hasText(holderStrategyRef)) {
|
||||
inboundChannelSecurityInterceptor.addPropertyValue("securityContextHolderStrategy",
|
||||
new RuntimeBeanReference(holderStrategyRef));
|
||||
}
|
||||
else {
|
||||
inboundChannelSecurityInterceptor.addPropertyValue("securityContextHolderStrategy", BeanDefinitionBuilder
|
||||
.rootBeanDefinition(SecurityContextHolderStrategyFactory.class).getBeanDefinition());
|
||||
}
|
||||
|
||||
return context.registerWithGeneratedName(inboundChannelSecurityInterceptor.getBeanDefinition());
|
||||
}
|
||||
|
||||
@@ -459,4 +474,18 @@ public final class WebSocketMessageBrokerSecurityBeanDefinitionParser implements
|
||||
|
||||
}
|
||||
|
||||
static class SecurityContextHolderStrategyFactory implements FactoryBean<SecurityContextHolderStrategy> {
|
||||
|
||||
@Override
|
||||
public SecurityContextHolderStrategy getObject() throws Exception {
|
||||
return SecurityContextHolder.getContextHolderStrategy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getObjectType() {
|
||||
return SecurityContextHolderStrategy.class;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -300,6 +300,9 @@ websocket-message-broker.attrlist &=
|
||||
websocket-message-broker.attrlist &=
|
||||
## Use AuthorizationManager API instead of SecurityMetadatasource
|
||||
attribute use-authorization-manager {xsd:boolean}?
|
||||
websocket-message-broker.attrlist &=
|
||||
## Use this SecurityContextHolderStrategy (note only supported in conjunction with the AuthorizationManager API)
|
||||
attribute security-context-holder-strategy-ref {xsd:string}?
|
||||
|
||||
intercept-message =
|
||||
## Creates an authorization rule for a websocket message.
|
||||
|
||||
@@ -934,6 +934,13 @@
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="security-context-holder-strategy-ref" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Use this SecurityContextHolderStrategy (note only supported in conjunction with the
|
||||
AuthorizationManager API)
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
</xs:attributeGroup>
|
||||
<xs:element name="intercept-message">
|
||||
<xs:annotation>
|
||||
|
||||
@@ -300,6 +300,9 @@ websocket-message-broker.attrlist &=
|
||||
websocket-message-broker.attrlist &=
|
||||
## Use AuthorizationManager API instead of SecurityMetadatasource
|
||||
attribute use-authorization-manager {xsd:boolean}?
|
||||
websocket-message-broker.attrlist &=
|
||||
## Use this SecurityContextHolderStrategy (note only supported in conjunction with the AuthorizationManager API)
|
||||
attribute security-context-holder-strategy-ref {xsd:string}?
|
||||
|
||||
intercept-message =
|
||||
## Creates an authorization rule for a websocket message.
|
||||
|
||||
@@ -934,6 +934,13 @@
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="security-context-holder-strategy-ref" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Use this SecurityContextHolderStrategy (note only supported in conjunction with the
|
||||
AuthorizationManager API)
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
</xs:attributeGroup>
|
||||
<xs:element name="intercept-message">
|
||||
<xs:annotation>
|
||||
|
||||
Reference in New Issue
Block a user