0

我在 JBoss 4.0.4(有点旧)中使用 httpinvoker 进行 EJB 调用。由于有很多客户端调用我的服务器,我想为服务器中的每个调用识别客户端。

有没有办法用 JBoss httpinvoker 做到这一点?

我可以想象在每个 HTTP 请求中添加一个标头来标识我的客户端,但是找不到在 httpinvoker 中添加标头的方法。

4

1 回答 1

1

审计建立在名称之上,因此以某种方式建立在身份验证方案之上。

因此,我建议使用标准客户端身份验证基础架构来解决您的问题。这也适用于 RMI(它不绑定到 HTTP),并且用户 ID 甚至被传递到您的 EJB 中。

服务器

  • 将 EJB 放入security-domain(ejb.jar: META-INF/jboss.xml)
  • 您可以使用application-policy 另一个UsersRolesLoginModule(conf/login-config.xml);这是默认策略,已配置。
  • 将 users.properties 和 roles.properties 添加到您的 ejb.jar 文件(顶级包):这些由UsersRolesLoginModule
  • 对于每个用户,将他的姓名和(虚拟)密码添加到 users.properties

客户

  • 创建一个实现 a 的回调类javax.security.auth.callback.CallbackHandler:当身份验证需要用户和密码时,使用此回调。
  • 创建一个javax.security.auth.login.LoginContext;将回调处理程序作为第二个参数传递;调用login()的实例LoginContext
  • 使用InitialContext
  • -Djava.security.auth.login.config=.../jboss-4/client/auth.conf启动客户端时添加

这样,用户 ID 从客户端传递到 EJB(作为标准身份验证过程的一部分)。现在,在 EJB 方法中,您可以通过调用实例getCallerPrincipal()来获取用户 ID。SessionContext我已经针对 JBoss 4.2.3 对此进行了测试

附加信息:JBoss 客户端身份验证


附录 1:

使用 RMI 或 HTTP,密码不会以安全的方式传输。在这种情况下,只需使用一个虚拟密码,这对于审计来说是可以的。

另一方面,如果您使用基于 SSL 的 RMI 或基于 HTTPS 的 HttpInvoker,您可以快速更改为真实且安全的身份验证。


附录 2:

我不确定它是否可以在没有定义角色的情况下工作。可能你必须

  • 在roles.properties 中为每个用户添加一行:添加一个连接角色,例如
  • 在 ejb-jar.xml 中也添加角色定义:security-role-ref对于每个 EJB,security-role并且method-permissionassembly-descriptor

更新

由于已经有登录模块,可能还有另一种可能性:

如果您有登录模块的源代码,则可以使用另一个TextCallback从客户端获取附加信息(在您的情况下为用户 ID)。该信息可用于创建自定义Principal. 在 EJB 中,结果getCallerPrincipal()可以转换为自定义主体。

于 2013-07-24T12:36:30.367 回答