如何在GlassFish中使用JSR 196身份验证获得角色?

时间:2010-02-01 10:13:58

标签: java authentication glassfish authorization jsr196

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

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

以下是我如何将用户映射到角色:

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

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

Here's also a related post...

希望这有帮助。