2

我想在 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一起使用才能使用自定义身份验证和自定义角色源?

4

2 回答 2

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/

于 2011-06-24T09:52:38.630 回答
0

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

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

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

这里还有一个相关的帖子...

希望这可以帮助。

于 2010-03-17T17:58:04.070 回答