Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 545C510F20 for ; Wed, 18 Dec 2013 14:43:49 +0000 (UTC) Received: (qmail 43231 invoked by uid 500); 18 Dec 2013 14:43:11 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 43140 invoked by uid 500); 18 Dec 2013 14:43:06 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 43104 invoked by uid 99); 18 Dec 2013 14:43:04 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Dec 2013 14:43:04 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 77C4D8B07; Wed, 18 Dec 2013 14:43:04 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: ningjiang@apache.org To: commits@camel.apache.org Date: Wed, 18 Dec 2013 14:43:04 -0000 Message-Id: <6604e36eb3804aa087d3b5d4f6bacc2d@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] git commit: CAMEL-7078 camel-cxf-transport component should propagate SecurityContext with thanks to Sergey Updated Branches: refs/heads/camel-2.11.x b77525227 -> 09b66baaf refs/heads/camel-2.12.x 1430c6b0d -> e8573c7b0 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/e8573c7b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e8573c7b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e8573c7b Branch: refs/heads/camel-2.12.x Commit: e8573c7b0b27f2289c5e6dec0a403963de2bb447 Parents: 1430c6b Author: Willem Jiang Authored: Wed Dec 18 22:39:51 2013 +0800 Committer: Willem Jiang Committed: Wed Dec 18 22:41:34 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/e8573c7b/components/camel-cxf-transport/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-cxf-transport/pom.xml b/components/camel-cxf-transport/pom.xml index 9022f8f..a12151c 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/e8573c7b/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/e8573c7b/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);