Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jboss httpinvoker中的客户端标识符(审核)_Jboss_Auditing_Httpinvoker - Fatal编程技术网

jboss httpinvoker中的客户端标识符(审核)

jboss httpinvoker中的客户端标识符(审核),jboss,auditing,httpinvoker,Jboss,Auditing,Httpinvoker,我正在使用JBoss4.0.4(有点旧)中的httpinvoker进行EJB调用。 因为有太多的客户端调用我的服务器,所以我想为服务器中的每个调用标识客户端 有没有办法用JBoss httpinvoker做到这一点 我可以想象在每个HTTP请求中添加一个头来标识我的客户机,但找不到在httpinvoker中添加头的方法。审计建立在名称的基础上,因此以某种方式建立在身份验证方案的基础上 因此,我建议使用标准的客户端身份验证基础设施来解决您的问题。这也适用于RMI(它不绑定到HTTP),用户ID甚至

我正在使用JBoss4.0.4(有点旧)中的httpinvoker进行EJB调用。 因为有太多的客户端调用我的服务器,所以我想为服务器中的每个调用标识客户端

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


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

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

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

服务器

  • 将EJB放在
    安全域中(EJB.jar:META-INF/jboss.xml)
  • 您可以使用
    应用程序策略
    其他策略,该策略仅适用于
    UsersRolesLoginModule
    (conf/login config.xml);这是默认策略,它已配置
  • 将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
通过这种方式,用户ID从客户端传递到EJB(作为标准身份验证过程的一部分)。现在,在EJB方法中,您可以通过在
SessionContext
实例上调用
getCallerPrincipal()
来获取用户ID。我已经用JBoss4.2.3测试过了

其他信息:


增编1:

使用RMI或HTTP时,密码不会以安全的方式传输。在这种情况下,只需使用一个伪密码,就可以进行审核

另一方面,如果使用SSL上的RMI或HTTPS上的HttpInvoker,则可以快速更改为真正安全的身份验证


增编2:

我不确定它是否在没有定义角色的情况下起作用。也许你必须这么做

  • 在roles.properties中为每个用户添加一行:例如,添加连接角色
  • 在ejb-jar.xml中也添加角色定义:
    security role ref
    用于每个ejb,以及
    程序集描述符中的
    安全角色
    方法权限

更新

由于已经存在登录模块,因此可能存在另一种可能性:


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

谢谢铍。我们已经有了这个解决方案。但是我们使用相同的(或者至少每个组使用相同的)用户ID。问题是同一个应用程序有多个实例(镜像)在运行,我们不能为每个实例都有一个新的用户id。它不可伸缩。我们有大量的服务器,而且增长速度很快。@Suraj Chandran在这种情况下,我建议创建一个虚拟的LoginModule,让一切都通过。通过这种方式,客户端可以生成UUID或提供任何用户ID。作为替代,如果RDBMS/LDAP中已经存在数据,考虑使用/实现Login模块来对抗这些数据库。@ BerryLIUM当前的登录模块基于Kerberos,这当然是安全性所必需的。但是,您的意思是我添加了一个附加的登录模块(与现有模块一起)来获取虚拟凭据,并从服务器端获取两个登录模块的主体吗?这可能吗?@Suraj Chandran如果你已经有了登录模块,你能使用
getCallerPrincipal
的结果吗?登录模块可以堆叠(“密码堆叠”),但我不知道这是否解决了您的问题。可以使用自定义主体类(可以为登录模块设置),但我也不确定这是否有帮助:它可以用来携带信息。最后一个想法:使用aspectj编写一些代码。如果没有任何帮助,您可以深入了解源代码。@Suraj Chandran如果您有登录模块的源代码,可能还有另一种可能性(我已经为问题添加了更新)。如果登录模块堆叠在一起,这甚至可能会起作用。