2014-12-07 29 views
4

我試圖寫我自己的ServerAuthModule,使用自定義登錄系統需求的用戶組成員。是否有可能來確定,而不是在ServerAuthModule(JASPIC)登錄時

如果我明白了一切正確的,什麼情況是,容器調用每一個傳入請求validateRequest方法,而我的SAM將檢查憑證,並告訴容器中的用戶的用戶名和組(如果證書右)通過CallbackHandler。

public class MySAM implements ServerAuthModule { 

    @Override 
    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { 

     // check user credentials 
     ... 

     // set username and groups 
     CallerPrincipalCallback cpCallback = new CallerPrincipalCallback(clientSubject, username); 
     GroupPrincipalCallback gpCallback = new GroupPrincipalCallback(clientSubject, groups); 
     callbackHandler.handle(new Callback[]{cpCallback, gpCallback} 

     return AuthStatus.SUCCESS; 
    } 

    ... 
} 

我現在的問題是,當用戶登錄時,我不知道用戶屬於哪個組。我只能檢查用戶是否在給定的組中。是否有可能給容器一個方法,它可以檢查一個用戶是否在給定的組中,而不是給它一個包含validateRequest方法中的組的數組?

boolean isInGroup(String username, String group) { 
    // ask backend system 
} 
+1

除了答案之外,我已經完全實現了這一點,作爲使用自定義授權規則可以完成的示例。請參閱http://arjan-tijms.omnifaces.org/2016/07/simplified-custom-authorization-rules.html – 2016-07-25 11:49:07

回答

4

你在做什麼看起來確實如此。

有在JASPIC沒有什麼概念了容器的方法就像你打算的。容器根據您提供的groups數組創建一組Principals,並且在那裏沒有空間容納一個方法。

在Java EE,JACC應該能夠做到這一點。每當需要回答isUserInRole問題時就會諮詢JACC策略提供者,並且每次需要確定用戶是否具有某種權限(例如,允許訪問/ adminpanel)。

在這一點上,你可以做一種逆向檢查,看看需要什麼樣的作用,對於給定的權限(使用角色權限的地圖,JACC在啓動時建立起來)。通過該角色,您可以使用自己的邏輯來確定用戶是否確實擁有該角色或組。

相關問題