【问题标题】:How to get roles with JSR 196 authentification in GlassFish?如何在 GlassFish 中通过 JSR 196 身份验证获得角色?
【发布时间】:2010-02-01 10:13:57
【问题描述】:

我想在 GlassFish 3 中使用符合JSR 196 的自定义身份验证模块。接口 javax.security.auth.message.ServerAuth 有方法:

AuthStatus validateRequest(
  MessageInfo messageInfo,
  javax.security.auth.Subject clientSubject,
  javax.security.auth.Subject serviceSubject
)

AuthStatus 可以是几个常量之一,例如 FAILURE 或 SUCCESS。

问题是:如何使用 JSR 196 从“角色数据库”中获取角色?

示例:服务器接收带有 SSO 令牌(例如 CAS 令牌)的请求,检查令牌是否有效,使用通过 JDBC 从数据库或通过 http 从 REST 服务获取的角色填充远程用户对象。

角色获取是否在 JSR 196 的范围内?怎么可能实现?

我是否必须将 JSR 196 与 JSR 115 一起使用才能使用自定义身份验证和自定义角色源?

【问题讨论】:

    标签: java authentication glassfish authorization jsr196


    【解决方案1】:

    这是来自我的 JSR-196OpenID 实现的代码示例。 该方法为当前 CallerPrincipal 设置存储在字符串数组中的角色:

    private boolean setCallerPrincipal(String caller, Subject clientSubject) {
                boolean rvalue = true;
                boolean assignGroups = true;
                // create CallerPrincipalCallback
                CallerPrincipalCallback cPCB = new CallerPrincipalCallback(
                                clientSubject, caller);
                if (cPCB.getName() == null && cPCB.getPrincipal() == null) {
                        assignGroups = false;
                }
                try {
                        handler.handle((assignGroups ? new Callback[] {
                                        cPCB,
                                        new GroupPrincipalCallback(cPCB.getSubject(),
                                                        assignedGroups) } : new Callback[] { cPCB }));
                        logInfo(DEBUG_JMAC, "jmac.caller_principal:" + cPCB.getName() + " "
                                        + cPCB.getPrincipal());
                } catch (Exception e) {
                        // should not happen
                        logger.log(Level.WARNING, "jmac.failed_to_set_caller", e);
                        rvalue = false;
                }
                return rvalue;
        }
    

    我在 validateRequest() 方法期间调用此方法。 你可以在这里看到完整的代码: http://code.google.com/p/openid4java-jsr196/source/browse/trunk/src/main/java/org/imixs/openid/openid4java/OpenID4JavaAuthModule.java

    此页面也将有所帮助: http://code.google.com/p/openid4java-jsr196/

    【讨论】:

      【解决方案2】:

      以下是我将用户映射到角色的方式:

      我的 web.xml 中有 3 个角色,并且我的 sun-web.xml 中有 3 个角色到组的映射,这些映射将这些角色映射到多个组。然后我有一个带有表用户的数据库,该表有一个名为“组”的列。该组对应于映射到角色的组。我还将基于 JSR 196 的自定义身份验证模块与 OpenID 一起使用。所以基本上每当用户登录他们的组时,都会从数据库中读取,然后我的应用程序会为他们分配相应的角色。这一切都是使用 J2EE 的标准声明性安全模型完成的。

      对于我的自定义身份验证模块,我使用了一个名为 AuthenticRoast 的库,这使事情变得相当简单。

      Here's also a related post...

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-23
        • 2016-07-08
        • 2015-05-31
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        相关资源
        最近更新 更多