我在 JBoss 4.0.4(有点旧)中使用 httpinvoker 进行 EJB 调用。由于有很多客户端调用我的服务器,我想为服务器中的每个调用识别客户端。
有没有办法用 JBoss httpinvoker 做到这一点?
我可以想象在每个 HTTP 请求中添加一个标头来标识我的客户端,但是找不到在 httpinvoker 中添加标头的方法。
我在 JBoss 4.0.4(有点旧)中使用 httpinvoker 进行 EJB 调用。由于有很多客户端调用我的服务器,我想为服务器中的每个调用识别客户端。
有没有办法用 JBoss httpinvoker 做到这一点?
我可以想象在每个 HTTP 请求中添加一个标头来标识我的客户端,但是找不到在 httpinvoker 中添加标头的方法。
审计建立在名称之上,因此以某种方式建立在身份验证方案之上。
因此,我建议使用标准客户端身份验证基础架构来解决您的问题。这也适用于 RMI(它不绑定到 HTTP),并且用户 ID 甚至被传递到您的 EJB 中。
服务器
security-domain
(ejb.jar: META-INF/jboss.xml)application-policy
另一个UsersRolesLoginModule
(conf/login-config.xml);这是默认策略,已配置。UsersRolesLoginModule
客户
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:
我不确定它是否可以在没有定义角色的情况下工作。可能你必须
security-role-ref
对于每个 EJB,security-role
并且method-permission
在assembly-descriptor
更新
由于已经有登录模块,可能还有另一种可能性:
如果您有登录模块的源代码,则可以使用另一个TextCallback
从客户端获取附加信息(在您的情况下为用户 ID)。该信息可用于创建自定义Principal
. 在 EJB 中,结果getCallerPrincipal()
可以转换为自定义主体。