我使用Spring安全性来保护对服务器上的休息服务的访问 . 应用程序使用Camel框架来处理请求/消息 . 因此,当请求通过spring安全性时,然后将它转换为Exchange类(我正在使用CXFRS组件),并由camel处理器准备进一步处理 . 处理交换的方式应取决于用户角色,但是:
如何从交换中带出用户?
据我所知,CXF Camel组件将身份验证对象存储在名为 Exchange.AUTHENTICATION 的标头中 . 查看Camel-Spring Security integration了解更多详情 .
Exchange.AUTHENTICATION
如果您需要更多原始访问权限,请检查this link . 它解释了如何获取当前的 HttpServletRequest 对象 . 从那里,你应该有权访问会话,因此,SecurityContext . 就像是:
HttpServletRequest
Message cxfMessage = exchange.getIn().getHeader(CxfConstants.CAMEL_CXF_MESSAGE, Message.class); HttpServletRequest request = (HttpServletRequest)cxfMessage.get("HTTP.REQUEST"); User currentUser = getCurrentUser(request); public static User getCurrentUser(HttpServletRequest request) { HttpSession session = request.getSession(false); if(session != null) { SecurityContext securityContext = (SecurityContext) session.getAttribute((HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY)); if(securityContext != null && securityContext.getAuthentication() != null && securityContext.getAuthentication().getPrincipal() != null && securityContext.getAuthentication().getPrincipal() instanceof User) { return (User)securityContext.getAuthentication().getPrincipal(); } } return null; }
您甚至可以直接从 HttpSessionSecurityContextRepository 获取它 .
HttpSessionSecurityContextRepository
您需要提供有关camel如何将请求转换为交换类的更多详细信息 . 假设您的请求是作为MyRequest类进行的,您应该可以执行以下操作:MyRequest incoming= (MyRequest)exchange.getIn().getBody();incoming.getUser();
MyRequest incoming= (MyRequest)exchange.getIn().getBody();
incoming.getUser();
2 回答
据我所知,CXF Camel组件将身份验证对象存储在名为
Exchange.AUTHENTICATION
的标头中 . 查看Camel-Spring Security integration了解更多详情 .如果您需要更多原始访问权限,请检查this link . 它解释了如何获取当前的
HttpServletRequest
对象 . 从那里,你应该有权访问会话,因此,SecurityContext . 就像是:您甚至可以直接从
HttpSessionSecurityContextRepository
获取它 .您需要提供有关camel如何将请求转换为交换类的更多详细信息 . 假设您的请求是作为MyRequest类进行的,您应该可以执行以下操作:
MyRequest incoming= (MyRequest)exchange.getIn().getBody();
incoming.getUser();