시스템 로그인 구성의 JAAS 사용자 정의 로그인 모듈 개발
Liberty 서버의 경우, 다수의 JAAS(Java™ Authentication and Authorization Service) 플러그인 위치가 시스템 로그인의 구성을 위해 존재합니다. Liberty는 시스템 로그인 구성을 사용하여 수신 요청을 인증합니다. 사용자 정의 JAAS 로그인 모듈을 개발하여 정보를 시스템 로그인 구성의 Subject에 추가할 수 있습니다.
이 태스크 정보
애플리케이션 로그인 구성은 서블릿 애플리케이션에서 특정 인증 정보에 근거한 주제를 얻기 위해 호출됩니다. Liberty 애플리케이션 로그인 또는 시스템 로그인 구성에 플러그인하는 로그인 모듈을 작성하는 경우에는 특정 정보의 제시 시점과 해당 정보의 사용 방법을 아는 로그인 구성 로직을 개발해야 합니다. 자세한 정보는 JAAS 구성 및 JAAS 로그인 모듈의 내용을 참조하십시오.
시스템 로그인 구성으로 JAAS 사용자 정의 로그인 모듈을 개발하려면 다음 프로시저의 단계를 따르십시오.
프로시저
- 사용 가능한 콜백 및 해당 콜백 작동 방법을 파악하십시오.
사용 가능한 콜백에 대한 자세한 정보는 JAAS에 대한 프로그래밍 방식의 로그인을 참조하십시오.
참고: Liberty는 다음 콜백만 지원합니다.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: ");
- 공유 상태 변수 및 해당 변수 작동 방법을 해석하십시오. 로그인 중 WebSphere® Application Server WebSphere Application Server Traditional에서 작성한 오브젝트에 액세스하려면 다음의 공유 상태 변수를 참조하십시오. 이러한 변수에 대한 자세한 정보는 프로그래밍 인터페이스
- com.ibm.wsspi.security.auth.callback.Constants.WSPRINCIPAL_KEY
- 구현된 java.security.Principal 인터페이스의 오브젝트를 지정하십시오. 이 공유 상태 변수는 읽기 전용 용도입니다. 이 변수를 공유 상태로 사용자 정의 로그인 모듈에 대해 설정하지 마십시오. 기본 로그인 모듈이 이 변수를 설정합니다.
- com.ibm.wsspi.security.auth.callback.Constants.WSCREDENTIAL_KEY
- com.ibm.websphere.security.cred.WSCredential 오브젝트를 지정하십시오. 이 공유 상태 변수는 읽기 전용 용도입니다. 이 변수를 공유 상태로 사용자 정의 로그인 모듈에 대해 설정하지 마십시오. 기본 로그인 모듈은 이 변수를 설정합니다.
- com.ibm.wsspi.security.auth.callback.Constants.WSSSOTOKEN_KEY
- com.ibm.wsspi.security.token.SingleSignonToken 오브젝트를 지정하십시오. 이 변수를 공유 상태로 사용자 정의 로그인 모듈에 대해 설정하지 마십시오. 기본 로그인 모듈이 이 변수를 설정합니다.
- 옵션: Liberty의 사용자 정의 JAAS 로그인 모듈에 대한 해시 테이블을 파악하십시오. 세부사항은 해시 테이블 로그인 모듈의 내용을 참조하십시오.
- 콜백 및 공유 상태를 사용하여 샘플 사용자 정의 로그인 모듈을 개발하십시오.
다음 샘플을 사용하여 일부 콜백 및 공유 상태 변수를 사용하는 방법에 대해 학습할 수 있습니다.
public class CustomCallbackLoginModule implements LoginModule { protected Map<String, ?> _sharedState; protected Subject _subject = null; protected CallbackHandler _callbackHandler; private final String customPrivateCredential = "CustomLoginModuleCredential"; /** * Initialization of login module */ 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) { // handle exception } 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; } }
- 옵션: 해시 테이블 로그인을 사용하여 샘플 사용자 정의 로그인 모듈을 개발하십시오.
다음 샘플을 사용하여 해시 테이블 로그인을 사용하는 방법에 대해 학습할 수 있습니다.
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; /** * Custom login module that adds another PublicCredential to the subject */ @SuppressWarnings("unchecked") public class CustomHashtableLoginModule implements LoginModule { protected Map<String, ?> _sharedState; protected Map<String, ?> _options; /** * Initialization of login module */ 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"); // Sample of creating custom cache key customProperties.put(AttributeNameConstants.WSCREDENTIAL_CACHE_KEY, "customCacheKey"); /* * Sample for creating user ID and security name * customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, "userId"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, "securityName"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_REALM, "realm"); * customProperties.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, "groupList"); */ /* * Sample for creating user ID and password * 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; } }
다음에 수행할 작업
server.xml 파일의 WEB_INBOUND 및 DEFAULT JAAS(Java Authentication and Authorization Service) 시스템 로그인 구성에 사용자 정의 로그인 모듈을 추가하십시오. 사용자 정의 로그인 모듈 클래스를 JAR 파일(예: customLoginModule.jar)에 지정한 후에 Liberty 서버가 JAR 파일을 사용할 수 있도록 하십시오. Liberty에 대한 JAAS 사용자 정의 로그인 모듈 구성의 내용을 참조하십시오.

파일 이름: twlp_dev_custom_jaas.html