Added MessageHeaders and MessageBuilder. Messages are now immutable (including header maps).

This commit is contained in:
Mark Fisher
2008-07-17 22:58:56 +00:00
parent b9ea75ea98
commit 2c95306f63
91 changed files with 1154 additions and 1083 deletions

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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() {

View File

@@ -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;
}

View File

@@ -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() {