【问题标题】:Client identifier in jboss httpinvoker (auditing)jboss httpinvoker 中的客户端标识符(审计)
【发布时间】:2013-07-25 05:32:23
【问题描述】:

我在 JBoss 4.0.4(有点旧)中使用 httpinvoker 进行 EJB 调用。 由于有很多客户端调用我的服务器,我想为服务器中的每个调用识别客户端。

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

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

【问题讨论】:

    标签: jboss auditing httpinvoker


    【解决方案1】:

    审核建立在名称之上,因此以某种方式建立在身份验证方案之上。

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

    服务器

    • 将 EJB 放入 security-domain (ejb.jar: META-INF/jboss.xml)
    • 你可以使用application-policy other,这只是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 的实例上调用 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:

    我不确定它是否在不定义角色的情况下工作。可能你必须

    • 在roles.properties 中为每个用户添加一行:例如添加一个连接角色
    • 也在 ejb-jar.xml 中添加角色定义:security-role-ref 用于每个 EJB,security-rolemethod-permissionassembly-descriptor

    更新

    由于已经有登录模块,可能还有另一种可能:

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

    【讨论】:

    • 谢谢铍。我们已经有了这个解决方案。但是我们使用相同的(或至少每个组使用相同的)userId。问题是同一个应用程序有多个实例(镜像)在运行,我们不能为每个实例设置一个新的用户 ID。它不可扩展。我们拥有大量服务器,而且还在快速增长。
    • @Suraj Chandran 在这种情况下,我建议创建一个虚拟的 LoginModule 来传递所有内容。这样,客户端可以生成 UUID 或提供任何用户 ID。作为替代方案,如果 RDBMS/LDAP 中已有数据,请考虑针对这些数据库使用/实施 LoginModule。
    • @Berryllium 当前的登录模块基于 Kerberos,当然,这是安全所必需的。但是你的意思是我添加了一个额外的登录模块(连同现有的),它可以采用虚拟凭据,并从服务器端获得两个登录模块的主体?这甚至可能吗?
    • @Suraj Chandran 如果你已经有一个登录模块,你可以使用getCallerPrincipal 的结果吗?登录模块可以堆叠(“密码堆叠”),但我不知道这是否能解决您的问题。可以使用自定义主体类(可以为登录模块设置),但我不确定这是否有帮助:它可以用来携带信息。最后的想法:使用 aspectj 编写一些代码。如果没有任何帮助,您可以深入研究源代码。
    • @Suraj Chandran 如果您有登录模块的源代码,则可能还有另一种可能性(我已对问题添加了更新)。如果登录模块是堆叠的,这甚至可能会起作用。
    猜你喜欢
    • 2011-11-27
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2012-02-15
    • 2010-12-09
    相关资源
    最近更新 更多