為 Liberty 開發自訂 JASPIC 鑑別提供者
您可以建立類別來實作 JSR 196: Java™ Authentication Service Provider Interface for Containers 規格中說明的必要介面,以開發自訂 Java Authentication SPI for Containers (JASPIC) 鑑別提供者。
開始之前
關於這項作業
只要協力廠商鑑別提供者符合 Java Authentication SPI for Containers (JASPIC) 1.1 版指定的 Servlet 儲存器,WebSphere Application Server Liberty 就支援使用該協力廠商鑑別提供者。
Servlet 儲存器定義了一些介面,安全執行時期環境會使用這些介面,並與 WebSphere® Application Server 中的 Web 儲存器搭配使用,以便在應用程式處理 Web 要求之前和之後,呼叫鑑別模組。必須在安全配置中啟用 JASPIC,才會執行使用 JASPIC 模組的鑑別。
如果要開發自訂鑑別提供者,請建立類別來實作 JSR 196: Java Authentication Service Provider Interface for Containers 規格中說明的必要介面。提供者可以使用一個或多個鑑別模組來進行鑑別。模組可以使用回呼來執行鑑別,也可以將必要的使用者身分資訊手動新增至用戶端主體。
程序
- 建立一個實作 javax.security.auth.message.config.AuthConfigProvider 介面的類別。 AuthConfigProvider 實作類別必須定義一個具有兩個引數的公用建構子,以及 getServerAuthConfig 公用方法:
import java.util.Map; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.config.AuthConfigFactory; import javax.security.auth.message.config.AuthConfigProvider; import javax.security.auth.message.config.ServerAuthConfig; public class SampleAuthConfigProvider implements AuthConfigProvider { public SampleAuthConfigProvider(Map<String, String> properties, AuthConfigFactory factory) { ... } public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler) throws AuthException { ... } }
當應用程式 Web 模組要處理的要求送達時,WebSphere Application Server 會使用 AuthConfigProvider 實作類別的實例。會使用 getServerAuthConfig 方法,來取得 ServerAuthConfig 實例。authentication 模組會使用方法呼叫中的 CallbackHandler 引數。
- 建立一個實作 javax.security.auth.message.config.ServerAuthConfig 介面的類別。 ServerAuthConfig 實作類別必須定義 getAuthContextID 和 getAuthContext 公用方法:
import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.config.ServerAuthConfig; import javax.security.auth.message.config.ServerAuthContext; public class SampleServerAuthConfig implements ServerAuthConfig { public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException { ... } public ServerAuthContext getAuthContext(String authContextID, Subject serviceSubject, Map properties) throws AuthException { ... } }
會使用 ServerAuthConfig 實作類別中的 getAuthContextID 和 getAuthContext 方法,來取得 ServerAuthContext 實例。
- 建立一個實作 javax.security.auth.message.config.ServerAuthContext 介面的類別。 ServerAuthContext 實作類別必須定義 validateRequest 和 secureResponse 公用方法:
import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.config.ServerAuthContext; public class SampleServerAuthContext implements ServerAuthContext { public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... } public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException { ... } }
會使用 ServerAuthContext 實作類別中的 validateRequest 方法來呼叫模組,以便鑑別所接收的 Web 要求訊息。如果鑑別結果成功,Web 儲存器會分派所接收的 Web 要求訊息,而由目標 Web 模組在應用程式中處理該 Web 要求訊息。如果鑑別結果失敗,則會拒絕該要求,並提供適當的回應狀態。
- 建立一個實作 javax.security.auth.message.module.ServerAuthModule 介面的類別。 ServerAuthModule 實作類別必須定義 initialize、validateRequest 和 secureResponse 公用方法:
import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import javax.security.auth.message.MessagePolicy; import javax.security.auth.message.module.ServerAuthModule; public class SampleAuthModule implements ServerAuthModule { public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, Map options) throws AuthException { ... } public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... } public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException { ... } public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException { ... } }
ServerAuthContext 實作類別會呼叫 ServerAuthModule 實作類別中的 initialize 方法,來起始設定 authentication 模組,並使其與 ServerAuthContext 實例相關聯。
會使用此類別中的 validateRequest 和 secureResponse 方法,來鑑別所接收之 javax.security.auth.message.MessageInfo 中包含的 javax.Servlet.http.HttpServletRequest 和 javax.Servlet.http.HttpServletResponse。這些方法可以使用 initialize 方法中所收到的 CallbackHandler 實例,來與 WebSphere 安全執行時期互動,以驗證使用者密碼,以及與作用中的使用者登錄互動,以擷取使用者的唯一 ID 和群組成員資格。所擷取的資料會放在用戶端主體中之專用認證集的雜湊表中。WebSphere Application Server 在實作 CallbackHandler 時,支援下列三項回呼:- CallerPrincipalCallback
- GroupPrincipalCallback
- PasswordValidationCallback
WebSphere Application Server 預期使用 PasswordValidationCallback.getUsername() 和 CallerPrincipalCallback.getName() 取得的名稱值相同。如果不相同,會產生無法預期的結果。CallbackHandler 程序的 handle() 方法會循序處理方法的引數陣列中所提供的每一項回呼。因此,用戶端主體專用認證中的名稱值集,就是從所處理的最後一項回呼取得的。
如果鑑別模組不使用 CallbackHandler,且 validateRequest 傳回成功狀態,WebSphere Application Server 會要求 clientSubject 中必須包含 Hashtable 實例及使用者身分資訊,以便可以執行自訂登入,來取得使用者的認證。此 Hashtable 可以新增至用戶端主體,如下列範例所示:import java.util.Hashtable; import java.util.String; import javax.security.auth.Subject; import javax.security.auth.message.AuthException; import javax.security.auth.message.AuthStatus; import javax.security.auth.message.MessageInfo; import com.ibm.wsspi.security.registry.RegistryHelper; import com.ibm.wsspi.security.token.AttributeNameConstants.AttributeNameConstants; public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException { ... UserRegistry reg = RegistryHelper.getUserRegistry(null); String uniqueid = reg.getUniqueUserID(username); Hashtable hashtable = new Hashtable(); hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid); hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username); hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password); hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groupList); //optional clientSubject.getPrivateCredentials().add(hashtable); ... }
如需 Hashtable 需求及自訂登入的相關資訊,請參閱開發用於系統登入配置的 JAAS 自訂登入模組。


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twlp_develop_jaspic
檔名:twlp_develop_jaspic.html