2010-02-01 41 views
2

我想在GlassFish中3 javax.security.auth.message.ServerAuth有方法的接口使用符合JSR 196自定義的驗證模塊:如何在GlassFish中通過JSR 196驗證獲取角色?

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

AuthStatus可以是幾個常量像失敗或成功的一個。

的問題是:我如何才能讓角色從「角色DATEBASE」與JSR 196?

實施例:服務器接收與一個SSO令牌(CAS令牌例如)的請求時,檢查令牌是否有效,填充與角色遠程用戶對象經由JDBC或從REST服務通過http從數據庫獲取。

是在JSR 196的範圍內獲取的作用?那怎麼能實現呢?

我一定要使用JSR 196連同JSR 115使用自定義的身份驗證和自定義角色源?

回答

0

這裏是我的用戶如何映射到角色:

我在web.xml中3點的角色,也是我有3個在我的sun-web.xml中的角色到組的映射,映射這些角色的幾組。然後我有一個數據庫與表用戶有一個名爲「組」的列。該組對應於映射到角色的組。我還在OpenID中使用基於JSR 196的自定義驗證模塊。所以基本上每當用戶登錄他們的組是從數據庫中讀取,然後我的應用程序分配給他們相應的角色。這一切都是使用J2EE的標準聲明式安全模型完成的。

對於我的自定義驗證模塊我使用了一個名爲AuthenticRoast庫,這使得事情都簡單得多。

Here's also a related post...

希望這有助於。

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/

相關問題