【发布时间】:2013-07-25 05:32:23
【问题描述】:
我在 JBoss 4.0.4(有点旧)中使用 httpinvoker 进行 EJB 调用。 由于有很多客户端调用我的服务器,我想为服务器中的每个调用识别客户端。
有没有办法用 JBoss httpinvoker 做到这一点?
我可以想象在每个 HTTP 请求中添加一个标头来标识我的客户端,但找不到在 httpinvoker 中添加标头的方法。
【问题讨论】:
标签: jboss auditing httpinvoker
我在 JBoss 4.0.4(有点旧)中使用 httpinvoker 进行 EJB 调用。 由于有很多客户端调用我的服务器,我想为服务器中的每个调用识别客户端。
有没有办法用 JBoss httpinvoker 做到这一点?
我可以想象在每个 HTTP 请求中添加一个标头来标识我的客户端,但找不到在 httpinvoker 中添加标头的方法。
【问题讨论】:
标签: jboss auditing httpinvoker
审核建立在名称之上,因此以某种方式建立在身份验证方案之上。
因此,我建议使用标准客户端身份验证基础架构来解决您的问题。这也适用于 RMI(它不绑定到 HTTP),并且用户 ID 甚至会传递到您的 EJB。
服务器
security-domain (ejb.jar: META-INF/jboss.xml)application-policy other,这只是UsersRolesLoginModule (conf/login-config.xml);这是默认策略,已配置。UsersRolesLoginModule 使用这些
客户
javax.security.auth.callback.CallbackHandler的回调类:当身份验证需要用户和密码时使用此回调。javax.security.auth.login.LoginContext;将回调处理程序作为第二个参数传递;在 LoginContext 的实例上调用 login()
InitialContext 正常连接到 EJB 服务器
-Djava.security.auth.login.config=.../jboss-4/client/auth.conf
通过这种方式,用户 ID 从客户端传递到 EJB(作为标准身份验证过程的一部分)。现在,在 EJB 方法中,您可以通过在 SessionContext 实例上调用 getCallerPrincipal() 来获取用户 ID。我已经针对 JBoss 4.2.3 对此进行了测试
补充资料:JBoss client authentication
附录 1:
使用 RMI 或 HTTP,密码不会以安全的方式传输。在这种情况下,只需使用虚拟密码,即可进行审核。
另一方面,如果您使用基于 SSL 的 RMI 或基于 HTTPS 的 HttpInvoker,您可以快速更改为真正安全的身份验证。
附录 2:
我不确定它是否在不定义角色的情况下工作。可能你必须
security-role-ref 用于每个 EJB,security-role 和 method-permission 在 assembly-descriptor
更新
由于已经有登录模块,可能还有另一种可能:
如果您有登录模块的源代码,您可以使用另一个 TextCallback 从客户端获取更多信息(在您的情况下是用户 ID)。该信息可用于创建自定义Principal。在 EJB 中,getCallerPrincipal() 的结果可以转换为自定义主体。
【讨论】:
getCallerPrincipal 的结果吗?登录模块可以堆叠(“密码堆叠”),但我不知道这是否能解决您的问题。可以使用自定义主体类(可以为登录模块设置),但我不确定这是否有帮助:它可以用来携带信息。最后的想法:使用 aspectj 编写一些代码。如果没有任何帮助,您可以深入研究源代码。