2015-05-11 58 views
0

試着簡化TAI的實現。 創建TAI類,爲每個用戶設置登錄「user1」和「用戶組」列表而不使用UserRegistry。 將角色組映射添加到我的ear-file(「user-group」=>「user-role」)中。 爲我的戰爭增加了安全約束:爲角色爲「用戶角色」的用戶提供訪問資源。嘗試訪問頁面後有403錯誤:使用Websphere AS的簡單TAI(TrustAssociationInterceptor)AS

[11.05.15 19:43:27:444 MSK] 0000007c WebCollaborat A SECJ0129E: ... user2:defaultWIMFileBasedRealm ... default_host:/war/page.html, Authorization failed, Not granted any of the required roles: user-role 

我錯了什麼? 使用WAS 8.5.5。

我的TAI實現:

package ru.test.tai; 

// imports 

public class SimpleTAI implements TrustAssociationInterceptor { 
    public SimpleTAI() { 
     super(); 
    } 

    public boolean isTargetInterceptor(HttpServletRequest req) 
      throws WebTrustAssociationException { 
     System.out.println("isTargetInterceptor called"); 
     if (req.getRequestURI().matches(".*war.*")) { 
      System.out.println("true"); 
      return true; 
     } else { 
      System.out.println("false"); 
      return false; 
     } 
    } 

    public TAIResult negotiateValidateandEstablishTrust(HttpServletRequest req, 
      HttpServletResponse resp) throws WebTrustAssociationFailedException { 

     String userid = "user2"; 
     String uniqueid = "user2"; 
     List<String> groups = new ArrayList<String>(); 
     groups.add("user-group"); 
     String key = "user1Key"; 
     Subject subject = createSubject(userid, uniqueid, groups, key); 
     return TAIResult.create(HttpServletResponse.SC_OK, "notused", subject); 
    } 

    public int initialize(Properties arg0) 
      throws WebTrustAssociationFailedException { 
     return 0; 
    } 

    public String getVersion() { 
     return "1.0"; 
    } 

    public String getType() { 
     return this.getClass().getName(); 
    } 

    public void cleanup() { 
    } 

    private Subject createSubject(String userid, String uniqueid, List groups, 
      String key) { 
     Subject subject = new Subject(); 
     Hashtable hashtable = new Hashtable(); 
     hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid); 
     hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, userid); 
     hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groups); 
     System.out.println("Subject cache key is " + key); 
     hashtable.put(AttributeNameConstants.WSCREDENTIAL_CACHE_KEY, key); 
     subject.getPublicCredentials().add(hashtable); 

     return subject; 
    } 
} 

IBM應用-bnd.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<application-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee 
     http://websphere.ibm.com/xml/ns/javaee/ibm-application-bnd_1_0.xsd" 
    version="1.0"> 

    <security-role name="user-role"> 
     <group name="user-group" /> 
    </security-role> 
</application-bnd> 

回答

0

如果使用在註冊表中現有的非組,然後在ibm-application-bnd.xml你必須添加access-id像這樣(示例顯示用戶,組):

<security-role name="user-role"> 
    <user name="test" access-id="user:defaultWIMFileBasedRealm/test"/> 
    <group name="user-group" access-id="group:defaultWIMFileBasedRealm/user-group"/> 
</security-role> 

realm sh應該匹配你當前配置的用戶註冊表。

+0

我應該添加包含組和用戶的自定義領域來實現安全性嗎?這是自定義認證的最佳做法嗎? 我還必須對TAI說:「這個用戶是來自這個用戶境界的」? – Gregory

+0

@Gregory - 真的取決於你的要求。最佳實踐是使用一些衆所周知的用戶註冊表,如LD​​AP,因爲用戶分配可以由應用程序/系統管理員在外部輕鬆管理。如果您需要定製用戶存儲,則可以更好地實施[用戶註冊表](http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/)。 ae/cwim_userregbridge.html?cp = SSAW57_8.5.5%2F3-8-2-33-2-1-3-25-0&lang = zh)而不是TAI。 TAI主要用於對現有註冊表進行自定義身份驗證。 – Gas

+0

@Gregory您可以通過安全域將某些註冊表映射到服務器。一般而言,它是一個廣泛的主題,你有很多選擇,所以解決方案真的取決於你的要求。 – Gas