gpt4 book ai didi

java - 如何从无状态 session bean 获取 JSF 应用程序用户名

转载 作者:行者123 更新时间:2023-11-30 05:10:50 25 4
gpt4 key购买 nike

在我们的应用程序中,我们使用 JSF 和 EJB 3.0 (EclipseLink 2.0)。我们需要对无状态 session bean 中的每个连接使用 Oracle 代理授权。为此,我们需要获取数据库用户名以通过代理连接。 DB 用户名是通过 JSF 验证的用户名按规则构造的。

这是一篇关于 http://blogs.oracle.com/olaf/2010/04/using_oracle_proxy_authenticat.html 主题的文章

因此,当经过身份验证的用户调用 JSF 托管 bean 方法时,该方法又调用某个 session bean 方法,他的用户名必须以某种方式传递给 session bean。

现在我有两个不太好的解决方案:- 在每个 session bean 方法中将用户名作为参数传递(不是很简洁,但可以工作);- 上面文章中的解决方案:使用 session bean的类成员变量来存储用户名(不是线程安全的并且有潜在危险)

附注我找到了使用线程局部变量的解决方案:_http://www.adam-bien.com/roller/abien/entry/how_to_pass_context_with它工作正常,但仍然存在一个问题。在每次调用 ejb session bean 之前,我需要将当前用户名放入每个 jsf session 托管 bean 中,因为它必须位于同一线程中。

最佳答案

如果您的用户通过了容器的身份验证,您可以使用注入(inject)的 javax.ejb.SessionContext 实例来访问 ejb 中的用户名,如下所示:

@Resource
private SessionContext context;

private String getCurrentUsername() {
return context.getCallerPrincipal().getName();
}

编辑:如果通过登录配置和安全约束元素在 web.xml 中配置身份验证,则此方法有效。如果您自己进行身份验证,则可以使用 ServletFilter 和 HttpServletRequestWrapper 来覆盖 getUserPrincipal、getRemoteUser 和 isUserInRole(在 glassfish 中测试)。

如果您在 jsf bean 中处理身份验证,那么这可能不起作用,因为 ejb 已经初始化并注入(inject)了。然而,您也可以创建一个 session 范围的 ejb,它只保存用户名并将这个 bean 注入(inject)到您的无状态 bean 中。

关于java - 如何从无状态 session bean 获取 JSF 应用程序用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3402933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com