如何在无状态会话Bean中获取用户信息

时间:2008-12-01 14:48:19

标签: java java-ee ejb

我正在开发一个现有的j2ee应用程序,我需要从代码中删除一些特定于供应商的方法调用。

会话外观背后的daos调用ejb容器来获取用户的id和密码 - 以便连接到数据库。用于连接服务器的initialContext的用户标识和密码部分。

我可以使用sessionContext.getCallerPrincipal()获取用户ID

无论如何都要到达服务器连接上使用的SECURITY_CREDENTIALS,或者有没有办法将信息从服务器连接传递到ejbs(它们都是无状态会话bean)。

这是一个包含富客户端和Web前端的大型应用程序,在完美的世界中,我很乐意回过头来重新构建整个解决方案以使用J2EE安全性等 - 但不幸的是,这是不现实。

3 个答案:

答案 0 :(得分:1)

我不能给你一个通用的解决方案,但这对我们有用。我们让应用服务器作为特定用户连接到LDAP,该用户可以为其他用户请求凭据。然后我们有一些通用的安全代码,我们可以根据初始登录时的用户身份从会话bean内部请求用户凭据(就像你通过getCallerPrincipal()一样)。

我们还将用户标识放在线程局部变量中,这样来自EJB的调用链中的类不必是“容器感知”。他们只是从本地线程访问身份,并使用安全类来查找用户配置文件信息。这也使得更改测试实现变得容易,甚至可以更改LDAP查找以外的其他内容。

我们创建的其他便利是JDBCServiceLocator,它使用当前用户的用户/密码检索连接。因此,开发人员根本不必显式编写安全查找代码。

答案 1 :(得分:0)

出于安全原因,通常Java EE安全模型不允许检索用户密码。但这取决于实施。一些供应商提供了检索此类信息的方法,但如果您依赖此类实现,请注意应用程序的可移植性会受到影响。

一种常见的方法是编写一个servlet过滤器来拦截登录请求并保存凭证的副本,以便稍后使用。如果您的应用程序不使用Java EE安全基础结构,则可以轻松实现。这是因为有些供应商阻止您过滤身份验证servlet。

答案 2 :(得分:0)

罗宾,

听起来像我的计划。我想我在成功连接服务器后立即打电话,将凭证加载到我的连接类的threadLocal变量中。我希望有一种更简单的方法 - 但我猜不是。