You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2013/12/18 15:43:05 UTC
[2/2] git commit: CAMEL-7078 camel-cxf-transport component should
propagate SecurityContext with thanks to Sergey
CAMEL-7078 camel-cxf-transport component should propagate SecurityContext with thanks to Sergey
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/09b66baa
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/09b66baa
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/09b66baa
Branch: refs/heads/camel-2.11.x
Commit: 09b66baafbcc40b099fecd87222814281cecfba3
Parents: b775252
Author: Willem Jiang <wi...@gmail.com>
Authored: Wed Dec 18 22:39:51 2013 +0800
Committer: Willem Jiang <wi...@gmail.com>
Committed: Wed Dec 18 22:42:40 2013 +0800
----------------------------------------------------------------------
components/camel-cxf-transport/pom.xml | 1 +
.../message/DefaultCxfMesssageMapper.java | 40 +++++++++++++++++++-
.../message/DefaultCxfMessageMapperTest.java | 33 ++++++++++++++--
3 files changed, 70 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/09b66baa/components/camel-cxf-transport/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-cxf-transport/pom.xml b/components/camel-cxf-transport/pom.xml
index 5c085d8..4af0258 100644
--- a/components/camel-cxf-transport/pom.xml
+++ b/components/camel-cxf-transport/pom.xml
@@ -39,6 +39,7 @@
javax.ws.rs*;version="[0.0,2)",
javax.xml.stream*;version="[0.0,2)",
javax.xml.ws*;version="[0.0,3.0)",
+ javax.servlet*;resolution="optional";version="[0,4)",
org.apache.camel.*;${camel.osgi.import.camel.version},
org.springframework.beans*;resolution:=optional,
${camel.osgi.import.defaults},
http://git-wip-us.apache.org/repos/asf/camel/blob/09b66baa/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/message/DefaultCxfMesssageMapper.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/message/DefaultCxfMesssageMapper.java b/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/message/DefaultCxfMesssageMapper.java
index 77e5e20..9b122fd 100644
--- a/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/message/DefaultCxfMesssageMapper.java
+++ b/components/camel-cxf-transport/src/main/java/org/apache/camel/component/cxf/common/message/DefaultCxfMesssageMapper.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.component.cxf.common.message;
+import java.lang.reflect.Method;
+import java.security.Principal;
import java.util.List;
import java.util.Map;
@@ -23,6 +25,7 @@ import org.apache.camel.Exchange;
import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.message.Message;
+import org.apache.cxf.security.SecurityContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,15 +70,50 @@ public class DefaultCxfMesssageMapper implements CxfMessageMapper {
Object request = camelMessage.getHeader(Exchange.HTTP_SERVLET_REQUEST);
answer.put(CXF_HTTP_REQUEST, request);
+
+ if (request != null) {
+ setSecurityContext(answer, request);
+ }
+
Object response = camelMessage.getHeader(Exchange.HTTP_SERVLET_RESPONSE);
answer.put(CXF_HTTP_RESPONSE, response);
- // TODO propagate security context
LOG.trace("Processing {}, requestContentType = {}, acceptContentTypes = {}, encoding = {}, path = {}, basePath = {}, verb = {}",
new Object[]{camelExchange, requestContentType, acceptContentTypes, enc, path, basePath, verb});
return answer;
}
+
+ protected void setSecurityContext(Message cxfMessage, final Object request) {
+ try {
+ final Method getPrincipalMethod = request.getClass()
+ .getMethod("getUserPrincipal", new Class[] {});
+ final Method userInRoleMethod = request.getClass()
+ .getMethod("isUserInRole", new Class[] {String.class});
+ cxfMessage.put(SecurityContext.class, new SecurityContext() {
+
+ public Principal getUserPrincipal() {
+ try {
+ return (Principal)getPrincipalMethod.invoke(request, new Object[] {});
+ } catch (Throwable t) {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean isUserInRole(String role) {
+ try {
+ return (Boolean)userInRoleMethod.invoke(request, new Object[] {role});
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ });
+ } catch (Throwable t) {
+ // not expected
+ }
+ }
public void propagateResponseHeadersToCamel(Message cxfMessage, Exchange exchange,
HeaderFilterStrategy strategy) {
http://git-wip-us.apache.org/repos/asf/camel/blob/09b66baa/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/message/DefaultCxfMessageMapperTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/message/DefaultCxfMessageMapperTest.java b/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/message/DefaultCxfMessageMapperTest.java
index 1cc7f58..2d57f4a 100644
--- a/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/message/DefaultCxfMessageMapperTest.java
+++ b/components/camel-cxf-transport/src/test/java/org/apache/camel/component/cxf/common/message/DefaultCxfMessageMapperTest.java
@@ -20,11 +20,15 @@ import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Collections;
+import javax.servlet.http.HttpServletRequest;
+
import org.apache.camel.Exchange;
import org.apache.camel.component.cxf.transport.CamelTransportConstants;
import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.cxf.common.security.SimplePrincipal;
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
+import org.apache.cxf.security.SecurityContext;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
@@ -38,15 +42,38 @@ public class DefaultCxfMessageMapperTest extends Assert {
DefaultCxfMesssageMapper mapper = new DefaultCxfMesssageMapper();
- Exchange camelExchange = setupCamelExchange(requestURI, requestPath);
+ Exchange camelExchange = setupCamelExchange(requestURI, requestPath, null);
Message cxfMessage = mapper.createCxfMessageFromCamelExchange(
camelExchange, EasyMock.createMock(HeaderFilterStrategy.class));
assertEquals(requestURI, cxfMessage.get(Message.REQUEST_URI).toString());
assertEquals(requestPath, cxfMessage.get(Message.BASE_PATH).toString());
}
+
+ @Test
+ public void testSecurityContext() {
+ DefaultCxfMessageMapper mapper = new DefaultCxfMessageMapper();
+
+ HttpServletRequest request = EasyMock.createMock(HttpServletRequest.class);
+ request.getUserPrincipal();
+ EasyMock.expectLastCall().andReturn(new SimplePrincipal("barry"));
+ request.isUserInRole("role1");
+ EasyMock.expectLastCall().andReturn(true);
+ request.isUserInRole("role2");
+ EasyMock.expectLastCall().andReturn(false);
+ EasyMock.replay(request);
+ Exchange camelExchange = setupCamelExchange("/", "/", request);
+
+ Message cxfMessage = mapper.createCxfMessageFromCamelExchange(
+ camelExchange, EasyMock.createMock(HeaderFilterStrategy.class));
+ SecurityContext sc = cxfMessage.get(SecurityContext.class);
+ assertNotNull(sc);
+ assertEquals("barry", sc.getUserPrincipal().getName());
+ assertTrue(sc.isUserInRole("role1"));
+ assertFalse(sc.isUserInRole("role2"));
+ }
- private Exchange setupCamelExchange(String requestURI, String requestPath) {
+ private Exchange setupCamelExchange(String requestURI, String requestPath, HttpServletRequest request) {
org.apache.camel.Message camelMessage = EasyMock
.createMock(org.apache.camel.Message.class);
Exchange camelExchange = EasyMock.createMock(Exchange.class);
@@ -78,7 +105,7 @@ public class DefaultCxfMessageMapperTest extends Assert {
camelMessage.getHeader(Exchange.HTTP_QUERY, String.class);
EasyMock.expectLastCall().andReturn("");
camelMessage.getHeader(Exchange.HTTP_SERVLET_REQUEST);
- EasyMock.expectLastCall().andReturn(null);
+ EasyMock.expectLastCall().andReturn(request);
camelMessage.getHeader(Exchange.HTTP_SERVLET_RESPONSE);
EasyMock.expectLastCall().andReturn(null);