2015-05-05 96 views
3

我開發了安全驗證模塊(SAM)並實施了validateRequest方法。我也有一個簡單的webapp配置使用這個SAM。如何在JASPIC中保存經過身份驗證的用戶?

在我validateRequest方法,我檢查clientSubject並設置CallerPrincipalCallback用硬編碼的用戶名和一個硬編碼的組名GroupPrincipalCallback

final CallerPrincipalCallback callerPrincipalCallback = new CallerPrincipalCallback(clientSubject, "anonymous"); 
final GroupPrincipalCallback groupPrincipalCallback = new GroupPrincipalCallback(clientSubject, new String[] {"user"}); 

try { 
    this.handler.handle(new Callback[] {callerPrincipalCallback, groupPrincipalCallback}); 
} catch (IOException | UnsupportedCallbackException e) { 
    logger.error(e.getMessage()); 
} 

我注意到,每次我刷新一個servlet在我的web應用程序中,客戶對象是簡單的空白,logger.debug("Client: {}", clientSubject);

2015-05-05 11:21:02,200 DEBUG n.m.j.s.Saml2AuthModule [http-listener-1(2)] Client: Subject: 

是否有可能「拯救」的對象以某種方式使主體連接到會話,我可以簡單地跳過記錄在S ame用戶每次?

編輯我想我找到了一種通過手動將其存儲在HttpSessionreq.getSession().setAttribute("subject", user);不漂亮,但它的作品。

回答

4

是否有可能以某種方式「保存」某個主題,從而將該主題連接到會話,並且我可以簡單地跳過每次都登錄同一個用戶?

是的,雖然JASPIC被設計爲無狀態,但它有一個選項來半自動化記住登錄。

然而,這個選項並不比在會話中存儲細節和在每個請求開始時重新驗證時少得多的代碼。

要做到這一點,首先設置在消息信息地圖的布爾返回成功之前和退出validateRequest方式:

messageInfo.getMap().put("javax.servlet.http.registerSession", TRUE.toString()); 

然後在每次請求您的身份驗證模塊(SAM)仍叫開始,但你可以執行下面的「協議」重新使用所存儲的身份數據(用戶名+角色):

HttpServletRequest request = (HttpServletRequest) messageInfo.getRequestMessage(); 
Principal userPrincipal = request.getUserPrincipal(); 

if (userPrincipal != null) { 
    handler.handle(new Callback[] { 
     new CallerPrincipalCallback(clientSubject, userPrincipal) } 
    ); 

    return SUCCESS; 
} 

我寫了一些更細節的blog entry。您可以在Java EE 7 samples project中找到一個使用完整工作示例的測試。

不幸的是,在JASPIC中沒有任何功能可以說只要(http)會話有效,就不需要調用SAM。

如果你關心這個功能,那麼請投給了以下問題:https://java.net/jira/browse/JASPIC_SPEC-20

我想我找到了一種通過手動將其存儲在HttpSession:req.getSession()的setAttribute(「主題「,用戶);不漂亮,但它的作品。

或多或少的「官方」的方法是存儲會話內,然後在每次調用validateRequest檢查開始時的用戶名和角色,如果這個數據是存在的,如果是的話把它交給了兩個回調。

我上面展示的方法並沒有真正的不同,但除了明顯的區別(一個回調vs兩個,從請求中獲取主體與從會話獲取主體)主要區別在於通過半自動容器可以自由使用其存儲數據的任何機制。

這可能只是會話中的一個屬性(一個簡單的JASPIC實現肯定可以這樣做),或者它可以使用大多數容器所具有的會話的一些隱藏部分。這個隱藏的部分不能直接被用戶代碼訪問,這可能有一些優點。

+1

謝謝,阿爾詹,我知道你對這個主題非常瞭解(發現了很多來自你的博客文章),並且正在尋找一種方法來伸手。我很高興你找到了我。 :) – Davio

+0

@Davio歡迎您,希望答案是有幫助的;) –

+0

非常有幫助,我很高興我不是唯一一個認爲這是目前規範中的遺漏,我會投我的票。 – Davio

相關問題