사용자 정의 JASPI 인증 제공자 개발

JSR 196: Java™ Authentication Service Provider Interface for Containers 스펙에 명시된 필수 인터페이스를 구현하는 클래스를 작성하여 사용자 정의 JASPI(Java Authentication SPI for Containers) 인증 제공자를 개발할 수 있습니다.

시작하기 전에

JSR 196: Java Authentication Service Provider Interface for Containers 스펙에서 JASPI 인증 제공자와 모듈에 대한 특정 인터페이스 구현 요구사항을 검토하십시오.

이 태스크 정보

WebSphere® Application Server에서는 JASPI(Java Authentication SPI for Containers) 버전 1.1에 지정된 서블릿 컨테이너 프로파일을 준수하는 써드파티 인증 제공자의 사용을 지원합니다.

웹 요청이 애플리케이션에 의해 처리되기 전이나 후에 서블릿 컨테이너 프로파일은 인증 모듈을 호출하기 위해 WebSphere Application Server에서 웹 컨테이너와 협력하여 보안 런타임 환경에 의해 사용되는 인터페이스를 정의합니다. JASPI 모듈을 사용하는 인증은 JASPI가 보안 구성에서 사용될 때와 수신된 웹 요청을 처리하는 웹 모듈과 구성된 JASPI 제공자를 연관시킬 때에만 수행됩니다.

사용자 정의 인증 제공자를 개발하려면 JSR 196: Java Authentication Service Provider Interface for Containers 스펙에 명시된 필수 인터페이스를 구현하는 클래스를 작성하십시오. 제공자는 인증을 위해 하나 이상의 인증 모듈을 사용할 수 있습니다. 모듈은 인증을 수행하기 위해 콜백을 사용하거나 필요한 사용자 ID 정보를 수동으로 클라이언트 주제에 추가할 수 있습니다. 제공자의 범위에 따라, 구현 클래스는 Application Server의 다양한 위치에 저장될 수 있습니다.

프로시저

  1. 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 {
                    ...
            }
    }

    요청이 애플리케이션의 웹 모듈에 의해 처리되기 위해 도달할 때 AuthConfigProvider 구현 클래스의 인스턴스는 WebSphere Application Server에 의해 사용됩니다. getServerAuthConfig 메소드는 ServerAuthConfig 인스턴스를 획득하는데 사용됩니다. 메소드 호출에서 CallbackHandler 인수는 인증 모듈에 의해 사용됩니다.

  2. 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 {
                    ...
            }
    }

    getAuthContextID와 ServerAuthConfig 구현 클래스의 getAuthContext 메소드는 ServerAuthContext 인스턴스를 획득하는데 사용됩니다.

  3. 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 메소드는 수신된 웹 요청 메시지를 인증하는 모듈을 호출하는데 사용됩니다. 인증 결과가 성공적이면 웹 컨테이너는 대상 웹 모듈이 애플리케이션에서 처리하는 수신된 웹 요청 메시지를 디스패치합니다. 인증 결과가 성공적이지 않으면 요청은 거부되고 적절한 응답 상태가 표시됩니다.

  4. javax.security.auth.message.module.ServerAuthModule 인터페이스를 구현하는 클래스를 작성하십시오.
    ServerAuthModule 구현 클래스는 초기화, 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 {
                    ...
            }
    }

    ServerAuthModule 구현 클래스의 initialize 메소드는 인증 모듈을 초기화하고 ServerAuthContext 인스턴스와 연관시키기 위해 ServerAuthContext 구현 클래스에 의해 호출됩니다.

    validateRequest와 이 클래스의 secureResponse 메소드는 javax.servlet.http.HttpServletRequest를 인증하는데 각각 사용되고 javax.servlet.http.HttpServletResponse이 수신되는 javax.security.auth.message.MessageInfo에서 포함되었습니다. 이러한 메소드는 사용자 비밀번호를 유효성 검증하기 위한 WebSphere 보안 런타임 및 사용자를 위한 고유 ID와 멤버쉽 그룹을 검색하기 위한 활성 사용자 레지스트리와 상호작용하기 위한 initialize 메소드에서 수신된 CallbackHandler 인스턴스를 사용할 수 있습니다. 검색된 데이터는 클라이언트 서브젝트에서 개인 신임 정보 세트에서 Hashtable에 위치합니다. CallbackHandler의 WebSphere Application Server 구현은 세 개의 콜백을 지원합니다.
    • CallerPrincipalCallback
    • GroupPrincipalCallback
    • PasswordValidationCallback
    CallbackHandler가 인증 모듈에 의해 사용되지 않고 validateRequest가 성공적 상태를 리턴하는 경우, 사용자 정의 로그인이 사용자를 위한 신임 정보를 획득하기 위해 수행될 수 있도록 Hashtable 인스턴스가 사용자 신원 정보로 clientSubject에 포함될 것을 WebSphere Application Server이 요청합니다. 이 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에 대한 시스템 로그인 구성에 대한 사용자 정의 로그인 모듈 개발에 대해 읽으십시오.

    Java Servlet 3.0 스펙의 인증 방법을 지원하려면 다음 로직이 ServerAuthModule 구현 클래스의 validateRequest 메소드에 추가되어야 합니다.
    import java.util.Map;
    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.servlet.http.HttpServletRequest;
    
    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
           throws AuthException {
           ...
           Map msgMap = messageInfo.getMap();
    
          if ("authenticate".equalsIgnoreCase(msgMap.get("com.ibm.websphere.jaspi.request"))) {
                  // this request is for the authenticate method
                  String authHeader
                       = ((HttpServletRequest) messageInfo.getRequestMessage()).getHeader("Authorization");
                  if (authHeader == null) {
                       // The user has not provided a username and password yet, return
                       // AuthStatus.SEND_CONTINUE to challenge
                  } 
                  else {
                       // Authenticate using the user name and password in the authentication header.
                  }
           }
           else {
                  // This is not a Servlet 3.0 authenticate request; handle as usual.
           }
           ...
    }
  5. 새로 작성된 클래스를 모두 컴파일하십시오.
    사용자 WebSphere Application Server 설치의 다음 JAR 파일은 성공적으로 새 클래스를 컴파일하기 위해 클래스 경로에 지정되어야 합니다.
  6. 컴파일된 클래스로 JAR 파일을 작성하십시오.
    요구사항에 따라서, JAR 파일은 세 개의 위치 중 하나에 있을 수 있습니다.
    • app_server_root/lib

      이 위치는 항상 WebSphere Application Server 클래스로더를 위한 클래스 경로에 있습니다. 이 위치를 사용할 때, 제공자는 모든 웹 모듈과 애플리케이션을 위한 셀 또는 도메인 기본 인증 제공자로서 일련의 웹 모듈 또는 애플리케이션을 위해 등록될 수 있고 지속적 제공자로 수동으로 등록될 수 있습니다.

    • 공유 라이브러리

      WebSphere Application Server 시스템의 어딘가에서 제공자 JAR 파일을 두십시오. JAR을 가리키는 공유 라이브러리를 구성하고, 해당 공유 라이브러리를 애플리케이션 또는 서버 클래스 경로에 추가하십시오. 공유 라이브러리에서 제공자는 웹 모듈 세트 또는 애플리케이션을 위해 등록되어야 하지만, 제공자는 셀 또는 도메인 기본 제공자로서 사용될 수 없습니다. 이는 공유 라이브러리가 서버 시작 동안 제공자 등록을 위한 클래스 경로에 없기 때문에 지속적 제공자로 등록될 수 없습니다. 공유 라이브러리 구성에 대한 자세한 정보는 공유 라이브러리 작성에 대해 읽으십시오.

    • 애플리케이션에서 임베디드

      유틸리티 JAR로서 애플리케이션의 EAR 파일에 제공자 JAR 파일을 포함하거나 웹 모듈 WAR에 컴파일된 클래스 파일을 임베드하십시오. 임베디드 제공자는 클래스가 웹 모듈에 대한 클래스 경로에 포함되는 한 애플리케이션에서 웹 모듈에 대해 등록될 수 있습니다. 이 제공자는 셀 또는 도메인 기본 제공자로서 사용될 수 없고, 지속적 제공자로 등록될 수도 없습니다. 애플리케이션의 클래스는 서버 시작 동안 제공자 등록에 사용될 수 없습니다.

  7. 관리 콘솔 또는 관리 스크립트를 사용하여 보안 구성에서 제공자를 구성하십시오.

    자세한 정보는 관리 콘솔을 사용하여 새 JASPI 인증 제공자 구성 또는 AdminTask 오브젝트에 대한 JaspiManagement 명령 그룹의 내용을 읽으십시오.


주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_jaspi_develop
파일 이름:tsec_jaspi_develop.html