我在JBoss 4.0.4(旧版本)中使用httpinvoker进行EJB调用。 由于有太多的客户端调用我的服务器,我想识别服务器中每个调用的客户端。
有没有办法用JBoss httpinvoker做到这一点?
我可以想象在每个HTTP请求中添加一个标头来标识我的客户端,但是找不到在httpinvoker中添加标头的方法。
答案 0 :(得分:1)
审计建立在名称上,因此以某种方式建立在身份验证方案上。
因此,我建议使用标准客户端身份验证基础结构来解决您的问题。这也适用于RMI(它不绑定到HTTP),用户ID甚至传递到EJB中。
服务器
security-domain
(ejb.jar:META-INF / jboss.xml)application-policy
(conf / login-config.xml)的UsersRolesLoginModule
其他;这是默认策略,已经配置。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()
实例上的SessionContext
来获取用户ID。我已经针对JBoss 4.2.3进行了测试
其他信息:JBoss client authentication
附录1:
使用RMI或HTTP,密码不会以安全的方式传输。在这种情况下,只需使用虚拟密码,这对于审核是可以的。
另一方面,如果您通过HTTPS使用基于SSL的RMI或HttpInvoker,您可以快速更改为真实安全的身份验证。
附录2:
我不确定,如果它没有定义角色的话。可能你必须
security-role-ref
,security-role
method-permission
和assembly-descriptor
更新
由于已有登录模块,可能还有另一种可能性:
如果您拥有登录模块的源代码,则可以使用另一个TextCallback
从客户端获取其他信息(在您的情况下是用户ID)。该信息可用于创建自定义Principal
。在EJB中,getCallerPrincipal()
的结果可以转换为自定义主体。