Java 如何从无状态会话bean获取JSF应用程序用户名
在我们的应用程序中,我们使用JSF和EJB3.0(EclipseLink 2.0)。我们需要对无状态会话bean中的每个连接使用Oracle代理授权。为此,我们需要获得DB用户名以通过代理进行连接。DB username是由JSF认证的username按照规则构造的 这是一篇关于这个主题的文章 因此,当一个经过身份验证的用户调用一个JSF托管bean方法,而该方法又调用某个会话bean方法时,他的用户名必须以某种方式传递给会话bean 现在我有两个不太好的解决方案: -在每个会话bean方法中将username作为参数传递(不是很整洁,但可以工作); -上面文章的解决方案是:使用会话bean的类成员变量来存储用户名(不是线程安全的,而且有潜在的危险) 另外,我找到了使用线程局部变量的解决方案:_http://www.adam-bien.com/roller/abien/entry/how_to_pass_context_withJava 如何从无状态会话bean获取JSF应用程序用户名,java,jpa,proxy,Java,Jpa,Proxy,在我们的应用程序中,我们使用JSF和EJB3.0(EclipseLink 2.0)。我们需要对无状态会话bean中的每个连接使用Oracle代理授权。为此,我们需要获得DB用户名以通过代理进行连接。DB username是由JSF认证的username按照规则构造的 这是一篇关于这个主题的文章 因此,当一个经过身份验证的用户调用一个JSF托管bean方法,而该方法又调用某个会话bean方法时,他的用户名必须以某种方式传递给会话bean 现在我有两个不太好的解决方案: -在每个会话bean方法中将
它工作正常,但仍然存在一个问题。在每次调用ejb会话bean之前,我需要将当前用户名放在每个jsf会话管理bean中,因为它必须在同一个线程中。如果您的用户通过容器进行身份验证,您可以使用注入的
javax.ejb.SessionContext
实例访问ejb中的用户名,如下所示:
@Resource
private SessionContext context;
private String getCurrentUsername() {
return context.getCallerPrincipal().getName();
}
编辑:如果通过登录配置和安全约束元素在web.xml中配置了身份验证,则此操作有效。如果您自己进行身份验证,则可以使用ServletFilter和HttpServletRequestWrapper覆盖getUserPrincipal、getRemoteUser和isUserInRole(在glassfish中测试)
如果在JSFbean中处理身份验证,那么这可能不起作用,因为ejb已经初始化并注入。但是,您也可以创建一个会话范围的ejb,它只保存用户名,并将这个bean注入到您的无状态bean中。非常感谢,Jörn。在我看来,你的解决办法很巧妙。另外,你能告诉我SessionContext什么时候不包含当前的web层用户名吗?