Angepasste JAAS-Anmeldemodule für eine Systemanmeldekonfiguration entwickeln
Für einen Liberty-Server sind mehrere JAAS-Plug-in-Punkte (Java™ Authentication and Authorization Service) zur Konfiguration von Systemanmeldungen vorhanden. Liberty verwendet Systemanmeldekonfigurationen für die Authentifizierung eingehender Anforderungen. Sie können ein JAAS-Anmeldemodul entwickeln, um dem Subject einer Systemanmeldekonfiguration Informationen hinzuzufügen.
Informationen zu diesem Vorgang
Anwendungsanmeldekonfigurationen werden von Servletanwendungen aufgerufen, um auf der Grundlage bestimmter Authentifizierungsinformationen ein Subjekt abzurufen. Wenn Sie ein Anmeldemodul schreiben, das in einer Liberty-Anwendungsanmeldekonfiguration oder Systemanmeldekonfiguration eingesetzt wird, müssen Sie eine Anmeldekonfigurationslogik entwickeln, die erkennt, wann bestimmte Informationen vorhanden und wie diese Informationen zu verwenden sind. Weitere Informationen finden Sie in den Abschnitten JAAS-Konfiguration und JAAS-Anmeldemodule.
Wenn Sie ein angepasstes JAAS-Anmeldemodul für eine Systemanmeldekonfiguration entwickeln möchten, befolgen Sie die Schritte in dieser Prozedur:
Vorgehensweise
- Verwendbare Callbacks und ihre Funktionsweise.
Weitere Informationen zu den verwendbaren Callbacks finden Sie unter Programmgesteuerte Anmeldung für JAAS.
Anmerkung: Liberty unterstützt nur die folgenden Callbacks:callbacks[0] = new javax.security.auth.callback.NameCallback("Username: "); callbacks[1] = new javax.security.auth.callback.PasswordCallback("Password: ", false); callbacks[2] = new com.ibm.websphere.security.auth.callback.WSCredTokenCallbackImpl("Credential Token: "); callbacks[3] = new com.ibm.websphere.security.auth.callback.WSServletRequestCallback("HttpServletRequest: ") callbacks[4] = new com.ibm.websphere.security.auth.callback.WSServletResponseCallback("HttpServletResponse: "); callbacks[5] = new com.ibm.websphere.security.auth.callback.WSAppContextCallback("ApplicationContextCallback: "); callbacks[6] = new WSRealmNameCallbackImpl("Realm Name: ", default_realm); callbacks[7] = new WSX509CertificateChainCallback("X509Certificate[]: "); callbacks[8] = wsAuthMechOidCallback = new WSAuthMechOidCallbackImpl("AuthMechOid: ");
- Gemeinsam genutzte Statusvariablen und ihre Funktionsweise. Wenn Sie auf die Objekte zugreifen möchten, die vom vollständigen Profil von WebSphere Application Server während einer Anmeldung erstellt werden, sehen Sie sich die Beschreibungen der folgenden gemeinsam genutzten Statusvariablen an. Weitere Informationen zu diesen Variablen finden Sie im Unterartikel "Systemprogrammierschnittstellen" des Abschnitts Programmierschnittstellen.
- com.ibm.wsspi.security.auth.callback.Constants.WSPRINCIPAL_KEY
- Gibt ein implementiertes Objekt der Schnittstelle java.security.Principal an. Diese gemeinsam genutzte Statusvariable ist schreibgeschützt. Definieren Sie diese Variable für angepasste Anmeldemodule nicht als gemeinsam genutzte Statusvariable. Diese Variable wird vom Standardanmeldemodul gesetzt.
- com.ibm.wsspi.security.auth.callback.Constants.WSCREDENTIAL_KEY
- Gibt das Objekt com.ibm.websphere.security.cred.WSCredential an. Diese gemeinsam genutzte Statusvariable ist schreibgeschützt. Definieren Sie diese Variable für angepasste Anmeldemodule nicht als gemeinsam genutzte Statusvariable. Diese Variable wird vom Standardanmeldemodul festgelegt.
- com.ibm.wsspi.security.auth.callback.Constants.WSSSOTOKEN_KEY
- Gibt das Objekt com.ibm.wsspi.security.token.SingleSignonToken an. Definieren Sie diese Variable für angepasste Anmeldemodule nicht als gemeinsam genutzte Statusvariable. Diese Variable wird vom Standardanmeldemodul gesetzt.
- Optional: Hashtabellen für angepasste JAAS-Anmeldemodule in Liberty. Nähere Einzelheiten finden Sie im Abschnitt Anmeldemodul mit Hashtabelle.
- Angepasstes Beispielanmeldemodul mit Callbacks und gemeinsam genutzten Status entwickeln.
Anhand des folgenden Beispiels können Sie lernen, wie einige Callbacks und gemeinsam genutzte Statusvariablen verwendet werden.
public class CustomCallbackLoginModule implements LoginModule { protected Map<String, ?> _sharedState; protected Subject _subject = null; protected CallbackHandler _callbackHandler; private final String customPrivateCredential = "CustomLoginModuleCredential"; /** * Initialisierung des Anmeldemoduls */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { _sharedState = sharedState; _subject = subject; _callbackHandler = callbackHandler; } public boolean login() throws LoginException { try { AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { _subject.getPrivateCredentials().add(customPrivateCredential); return null; } }); } catch (PrivilegedActionException e) { throw new LoginException(e.getLocalizedMessage()); } String username = null; char passwordChar[] = null; byte[] credToken = null; HttpServletRequest request = null; HttpServletResponse response = null; Map appContext = null; String realm = null; String authMechOid = null; java.security.cert.X509Certificate[] certChain = null; NameCallback nameCallback = null; PasswordCallback passwordCallback = null; WSCredTokenCallbackImpl wsCredTokenCallback = null; WSServletRequestCallback wsServletRequestCallback = null; WSServletResponseCallback wsServletResponseCallback = null; WSAppContextCallback wsAppContextCallback = null; WSRealmNameCallbackImpl wsRealmNameCallback = null; WSX509CertificateChainCallback wsX509CertificateCallback = null; WSAuthMechOidCallbackImpl wsAuthMechOidCallback = null; Callback[] callbacks = new Callback[9]; callbacks[0] = nameCallback = new NameCallback("Username: "); callbacks[1] = passwordCallback = new PasswordCallback("Password: ", false); callbacks[2] = wsCredTokenCallback = new WSCredTokenCallbackImpl("Credential Token: "); callbacks[3] = wsServletRequestCallback = new WSServletRequestCallback("HttpServletRequest: "); callbacks[4] = wsServletResponseCallback = new WSServletResponseCallback("HttpServletResponse: "); callbacks[5] = wsAppContextCallback = new WSAppContextCallback("ApplicationContextCallback: "); callbacks[6] = wsRealmNameCallback = new WSRealmNameCallbackImpl("Realm name:"); callbacks[7] = wsX509CertificateCallback = new WSX509CertificateChainCallback("X509Certificate[]: "); callbacks[8] = wsAuthMechOidCallback = new WSAuthMechOidCallbackImpl("AuthMechOid: "); try { _callbackHandler.handle(callbacks); } catch (Exception e) { // Behandlung der Ausnahme } if (nameCallback != null) username = nameCallback.getName(); if (passwordCallback != null) passwordChar = passwordCallback.getPassword(); if (wsCredTokenCallback != null) credToken = wsCredTokenCallback.getCredToken(); if (wsServletRequestCallback != null) request = wsServletRequestCallback.getHttpServletRequest(); if (wsServletResponseCallback != null) response = wsServletResponseCallback.getHttpServletResponse(); if (wsAppContextCallback != null) appContext = wsAppContextCallback.getContext(); if (wsRealmNameCallback != null) realm = wsRealmNameCallback.getRealmName(); if (wsX509CertificateCallback != null) certChain = wsX509CertificateCallback.getX509CertificateChain(); if (wsAuthMechOidCallback != null) authMechOid = wsAuthMechOidCallback.getAuthMechOid(); _subject.getPrivateCredentials().add("username = " + username); _subject.getPrivateCredentials().add("password = " + String.valueOf(passwordChar)); _subject.getPrivateCredentials().add("realm = " + realm); _subject.getPrivateCredentials().add("authMechOid = " + authMechOid.toString()); return true; } public boolean commit() throws LoginException { return true; } public boolean abort() { return true; } public boolean logout() { return true; } }
- Optional: Angepasstes Beispielanmeldemodul mit Anmeldung über die Hashtabelle entwickeln.
Anhand des folgenden Beispiels können Sie lernen, wie die Anmeldung über die Hashtabelle verwendet wird.
package com.ibm.websphere.security.sample; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginException; import javax.security.auth.spi.LoginModule; import com.ibm.wsspi.security.token.AttributeNameConstants; /** * Angepasstes Anmeldemodul, das dem Subjekt ein weiteres PublicCredential hinzufügt */ @SuppressWarnings("unchecked") public class CustomHashtableLoginModule implements LoginModule { protected Map<String, ?> _sharedState; protected Map<String, ?> _options; /** * Initialisierung des Anmeldemoduls */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { _sharedState = sharedState; _options = options; } public boolean login() throws LoginException { try { java.util.Hashtable<String, Object> customProperties = (java.util.Hashtable<String, Object>) _sharedState.get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY); if (customProperties == null) { customProperties = new java.util.Hashtable<String, Object>(); } customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, "userId"); // Beispiel für das Erstellen des angepassten Cacheschlüssels customProperties.put(AttributeNameConstants.WSCREDENTIAL_CACHE_KEY, "customCacheKey"); /* * Beispiel für das Erstellen von Benutzer-ID und Sicherheitsnamen * customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, "userId"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, "securityName"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_REALM, "realm"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, "groupList"); */ /* * Beispiel für das Erstellen von Benutzer-ID und Kennwort * customProperties.put(AttributeNameConstants.WSCREDENTIAL_USERID, "userId"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, "password"); */ Map<String, java.util.Hashtable> mySharedState = (Map<String, java.util.Hashtable>) _sharedState; mySharedState.put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY, customProperties); } catch (Exception e) { throw new LoginException("LoginException: " + e.getMessage()); } return true; } public boolean commit() throws LoginException { return true; } public boolean abort() { return true; } public boolean logout() { return true; } }
Nächste Schritte
Nehmen Sie Ihr angepasstes Anmeldemodul in die JAAS-Systemanmeldekonfigurationen WEB_INBOUND und DEFAULT der Datei server.xml auf. Nehmen Sie die angepasste Anmeldemodulklasse in eine JAR-Datei auf, z. B. customLoginModule.jar, und stellen Sie diese JAR-Datei dem Liberty-Server zur Verfügung. Nähere Informationen hierzu finden Sie unter Angepasstes JAAS-Anmeldemodul für Liberty konfigurieren.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_dev_custom_jaas
Dateiname: twlp_dev_custom_jaas.html