Added MessageHeaders and MessageBuilder. Messages are now immutable (including header maps).
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
package org.springframework.integration.security;
|
||||
|
||||
import org.springframework.integration.message.Message;
|
||||
import org.springframework.integration.message.MessageBuilder;
|
||||
import org.springframework.security.context.SecurityContext;
|
||||
|
||||
/**
|
||||
@@ -28,11 +29,12 @@ public class SecurityContextUtils {
|
||||
public static final String SECURITY_CONTEXT_HEADER_ATTRIBUTE = "SPRING_SECURITY_CONTEXT";
|
||||
|
||||
public static SecurityContext getSecurityContextFromHeader(Message<?> message) {
|
||||
return (SecurityContext) message.getHeader().getAttribute(SECURITY_CONTEXT_HEADER_ATTRIBUTE);
|
||||
return (SecurityContext) message.getHeaders().get(SECURITY_CONTEXT_HEADER_ATTRIBUTE);
|
||||
}
|
||||
|
||||
public static void setSecurityContextHeader(SecurityContext sctx, Message<?> message) {
|
||||
message.getHeader().setAttribute(SECURITY_CONTEXT_HEADER_ATTRIBUTE, sctx);
|
||||
public static Message<?> setSecurityContextHeader(SecurityContext sctx, Message<?> message) {
|
||||
return MessageBuilder.fromMessage(message)
|
||||
.setHeader(SECURITY_CONTEXT_HEADER_ATTRIBUTE, sctx).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -39,18 +39,18 @@ public class SecurityContextPropagatingChannelInterceptor extends ChannelInterce
|
||||
|
||||
@Override
|
||||
public Message<?> preSend(Message<?> message, MessageChannel channel) {
|
||||
this.setSecurityContextAttribute(message);
|
||||
return message;
|
||||
return this.createSecurityContextMessageIfPossible(message);
|
||||
}
|
||||
|
||||
protected void setSecurityContextAttribute(Message<?> message) {
|
||||
protected Message<?> createSecurityContextMessageIfPossible(Message<?> message) {
|
||||
SecurityContext securityContext = SecurityContextHolder.getContext();
|
||||
if (securityContext.getAuthentication() != null) {
|
||||
SecurityContextUtils.setSecurityContextHeader(securityContext, message);
|
||||
message = SecurityContextUtils.setSecurityContextHeader(securityContext, message);
|
||||
}
|
||||
else if (logger.isInfoEnabled()) {
|
||||
logger.info("No security context found");
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,13 +16,16 @@
|
||||
|
||||
package org.springframework.integration.security.channel;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.message.MessageHeader;
|
||||
import org.springframework.integration.message.Message;
|
||||
import org.springframework.integration.message.MessageHeaders;
|
||||
import org.springframework.integration.message.StringMessage;
|
||||
import org.springframework.integration.security.SecurityContextUtils;
|
||||
import org.springframework.security.Authentication;
|
||||
@@ -57,24 +60,24 @@ public class SecurityContextPropagatingChannelInterceptorTests {
|
||||
@Test
|
||||
public void testPropogationWhenSecurityContextExists() {
|
||||
this.associateContextWithThread();
|
||||
StringMessage message = new StringMessage("test");
|
||||
Message<?> message = new StringMessage("test");
|
||||
this.channel.send(message);
|
||||
message = (StringMessage) channel.receive(0);
|
||||
MessageHeader header = message.getHeader();
|
||||
assertTrue("No security context attribute found in header.", header.getAttributeNames().contains(
|
||||
SecurityContextUtils.SECURITY_CONTEXT_HEADER_ATTRIBUTE));
|
||||
message = channel.receive(0);
|
||||
MessageHeaders headers = message.getHeaders();
|
||||
assertTrue("No security context attribute found in header.",
|
||||
headers.keySet().contains(SecurityContextUtils.SECURITY_CONTEXT_HEADER_ATTRIBUTE));
|
||||
SecurityContext contextFromHeader = SecurityContextUtils.getSecurityContextFromHeader(message);
|
||||
assertEquals("Incorrect security context in message header.", securityContext, contextFromHeader);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHeaderNotSetWhenNoSecurityContextExists() {
|
||||
StringMessage message = new StringMessage("test");
|
||||
Message<?> message = new StringMessage("test");
|
||||
channel.send(message);
|
||||
message = (StringMessage) channel.receive(0);
|
||||
MessageHeader header = message.getHeader();
|
||||
assertFalse("Security context header found when no security context existed.", header.getAttributeNames()
|
||||
.contains(SecurityContextUtils.SECURITY_CONTEXT_HEADER_ATTRIBUTE));
|
||||
message = channel.receive(0);
|
||||
MessageHeaders headers = message.getHeaders();
|
||||
assertFalse("Security context header found when no security context existed.",
|
||||
headers.keySet().contains(SecurityContextUtils.SECURITY_CONTEXT_HEADER_ATTRIBUTE));
|
||||
}
|
||||
|
||||
private void associateContextWithThread() {
|
||||
|
||||
@@ -76,7 +76,7 @@ public class SecurityPropagatingChannelsParserTests {
|
||||
private boolean channelPropagatesSecurityContext(MessageChannel channel) {
|
||||
login("bob", "bobspassword");
|
||||
channel.send(new StringMessage("testMessage"));
|
||||
SecurityContext context = (SecurityContext) channel.receive(-1).getHeader().getAttribute(
|
||||
SecurityContext context = (SecurityContext) channel.receive(-1).getHeaders().get(
|
||||
"SPRING_SECURITY_CONTEXT");
|
||||
return context != null;
|
||||
}
|
||||
|
||||
@@ -142,8 +142,7 @@ public class SecurityEndpointInterceptorTests {
|
||||
|
||||
public Message<?> createMessageWithContext(SecurityContext securityContext) {
|
||||
Message<?> message = new StringMessage("test");
|
||||
SecurityContextUtils.setSecurityContextHeader(securityContext, message);
|
||||
return message;
|
||||
return SecurityContextUtils.setSecurityContextHeader(securityContext, message);
|
||||
}
|
||||
|
||||
public Message<?> createMessageWithoutContext() {
|
||||
|
||||
Reference in New Issue
Block a user