jboss httpinvoker中的客户端标识符(审核)
我正在使用JBoss4.0.4(有点旧)中的httpinvoker进行EJB调用。 因为有太多的客户端调用我的服务器,所以我想为服务器中的每个调用标识客户端 有没有办法用JBoss httpinvoker做到这一点jboss httpinvoker中的客户端标识符(审核),jboss,auditing,httpinvoker,Jboss,Auditing,Httpinvoker,我正在使用JBoss4.0.4(有点旧)中的httpinvoker进行EJB调用。 因为有太多的客户端调用我的服务器,所以我想为服务器中的每个调用标识客户端 有没有办法用JBoss httpinvoker做到这一点 我可以想象在每个HTTP请求中添加一个头来标识我的客户机,但找不到在httpinvoker中添加头的方法。审计建立在名称的基础上,因此以某种方式建立在身份验证方案的基础上 因此,我建议使用标准的客户端身份验证基础设施来解决您的问题。这也适用于RMI(它不绑定到HTTP),用户ID甚至
我可以想象在每个HTTP请求中添加一个头来标识我的客户机,但找不到在httpinvoker中添加头的方法。审计建立在名称的基础上,因此以某种方式建立在身份验证方案的基础上 因此,我建议使用标准的客户端身份验证基础设施来解决您的问题。这也适用于RMI(它不绑定到HTTP),用户ID甚至被传递到您的EJB中 服务器
- 将EJB放在
安全域中(EJB.jar:META-INF/jboss.xml)
- 您可以使用
其他策略,该策略仅适用于应用程序策略
(conf/login config.xml);这是默认策略,它已配置UsersRolesLoginModule
- 将users.properties和roles.properties添加到ejb.jar文件(顶级包):这些由
UsersRolesLoginModule
- 对于每个用户,将其名称和(虚拟)密码添加到users.properties
- 创建一个回调类,该类实现了一个
:当身份验证需要用户和密码时,使用该回调javax.security.auth.callback.CallbackHandler
- 创建一个
;将回调处理程序作为第二个参数传递;在javax.security.auth.login.LoginContext
LoginContext
- 使用
InitialContext
- 启动客户端时添加
-Djava.security.auth.login.config=…/jboss-4/client/auth.conf
SessionContext
实例上调用getCallerPrincipal()
来获取用户ID。我已经用JBoss4.2.3测试过了
其他信息:
增编1: 使用RMI或HTTP时,密码不会以安全的方式传输。在这种情况下,只需使用一个伪密码,就可以进行审核 另一方面,如果使用SSL上的RMI或HTTPS上的HttpInvoker,则可以快速更改为真正安全的身份验证
增编2: 我不确定它是否在没有定义角色的情况下起作用。也许你必须这么做
- 在roles.properties中为每个用户添加一行:例如,添加连接角色
- 在ejb-jar.xml中也添加角色定义:
用于每个ejb,以及security role ref
程序集描述符中的
和安全角色
方法权限
更新 由于已经存在登录模块,因此可能存在另一种可能性:
如果您有登录模块的源代码,则可以使用另一个
TextCallback
从客户端获取其他信息(在您的情况下是用户ID)。该信息可用于创建自定义主体
。在EJB中,可以将getCallerPrincipal()
的结果转换为自定义主体。谢谢铍。我们已经有了这个解决方案。但是我们使用相同的(或者至少每个组使用相同的)用户ID。问题是同一个应用程序有多个实例(镜像)在运行,我们不能为每个实例都有一个新的用户id。它不可伸缩。我们有大量的服务器,而且增长速度很快。@Suraj Chandran在这种情况下,我建议创建一个虚拟的LoginModule,让一切都通过。通过这种方式,客户端可以生成UUID或提供任何用户ID。作为替代,如果RDBMS/LDAP中已经存在数据,考虑使用/实现Login模块来对抗这些数据库。@ BerryLIUM当前的登录模块基于Kerberos,这当然是安全性所必需的。但是,您的意思是我添加了一个附加的登录模块(与现有模块一起)来获取虚拟凭据,并从服务器端获取两个登录模块的主体吗?这可能吗?@Suraj Chandran如果你已经有了登录模块,你能使用getCallerPrincipal
的结果吗?登录模块可以堆叠(“密码堆叠”),但我不知道这是否解决了您的问题。可以使用自定义主体类(可以为登录模块设置),但我也不确定这是否有帮助:它可以用来携带信息。最后一个想法:使用aspectj编写一些代码。如果没有任何帮助,您可以深入了解源代码。@Suraj Chandran如果您有登录模块的源代码,可能还有另一种可能性(我已经为问题添加了更新)。如果登录模块堆叠在一起,这甚至可能会起作用。