1

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

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

我能够使用sessionContext.getCallerPrincipal()

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

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

4

3 回答 3

1

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

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

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

于 2008-12-01T18:01:48.810 回答
0

罗宾,

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

于 2008-12-01T19:48:14.210 回答
0

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

一种常见的方法是编写一个 servlet 过滤器来拦截登录请求并保存凭据的副本,以供以后使用。如果您的应用程序不使用 Java EE 安全基础架构,那么这很容易实现。这是因为某些供应商阻止您过滤身份验证 servlet。

于 2008-12-01T17:07:46.860 回答