일반 발행 로그인 모듈을 사용한 사용자 정의 토큰 생성 및 이용

일반 발행 토큰 생성기 및 이용자인 GenericIssuedTokenGenerateLoginModule 및 GenericIssuedTokenConsumeLoginModule은 GenericSecurityTokenFactory 및 GenericSecurityToken SPIs와 함께 사용자 정의 토큰에 대한 엔드 투 엔드 솔루션을 구현하는 데 사용할 수 있습니다. 일반 발행 로그인 모듈을 사용한 사용자 정의 토큰 생성 및 이용은 정책 및 바인딩 또는 WSSAPI를 사용하여 수행될 수 있습니다.

시작하기 전에

새 JAAS 로그인 모듈 클래스를 추가할 수 있는 JAX-WS 서비스 클라이언트와 제공자 애플리케이션의 작동하는 세트가 있어야 합니다.

이 태스크 정보

세트 JAX-WS 서비스 클라이언트와 제공자 애플리케이션이 사용자 정의 토큰을 사용할 수 있도록 하려면 다음 단계를 따르십시오. 이러한 단계에서 MyToken은 작성 중인 토큰의 이름입니다.

이 태스크를 완료하면:
  1. 토큰 생성 및 토큰 이용을 위한 두 개의 JAAS 로그인 모듈이 작성됩니다.
  2. 일반 발생 토큰 이용자 및 생성기의 지원을 통해 토큰이 생성되고 이용됩니다.
  3. 그러면 정책 세트 및 바인딩이 있는 애플리케이션에 보안 제한조건이 적용됩니다.

프로시저

  1. 다음 생성기 JAAS 로그인 모듈을 작성하고 사용자의 애플리케이션 코드에 맞게 수정하여 사용하십시오.
    package test.tokens;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    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 javax.xml.soap.SOAPFactory;
    import javax.xml.soap.SOAPElement;
    import javax.xml.namespace.QName;
    import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
    import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
    
    public class MyCustomGenerator implements LoginModule {
    
      private Map _sharedState;
      private Map _options;
      private CallbackHandler _handler;
    
      public void initialize(Subject subject, CallbackHandler callbackHandler,
                             Map<String, ?> sharedState, Map<String, ?> options) {
    
        this._handler = callbackHandler;
        this._sharedState = sharedState;
        this._options = options;  
      }
      public boolean login() throws LoginException {
    
        GenericSecurityTokenFactory factory = null;
        try {
          factory = GenericSecurityTokenFactory.getInstance();
        } catch (Exception e) {
          throw new LoginException(e.toString());
        }
        if (factory == null) {
          throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null");
        }
        SecurityToken myToken = null;
        try {
          SOAPElement tokenElement = createCustomElement(factory);
          myToken = factory.getToken(tokenElement, new QName("http://www.acme.com","MyToken"));
        } catch (Exception e) {
          throw new LoginException(e.toString());
        }
        if (myToken == null) {
          throw new LoginException("myToken is null");
        }
    
        //Put the token in a list on the shared state where it will be available to be used by
        //stacked login modules
        factory.putGeneratorTokenToSharedState(_sharedState, myToken);
    
        return true;
      }
    
      private SOAPElement createCustomElement(GenericSecurityTokenFactory gstFactory) throws Exception {
        /*
          <acme:MyToken xmlns:acme="http://www.acme.com" 
                xmlns:utl="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" utl:Id="cust_3">
            <acme:EMail>joe.smith@acme.com</acme:EMail>
          </acme:MyToken>
        */
        SOAPFactory factory = SOAPFactory.newInstance();
    
        //Create the MyToken element
        SOAPElement tokElement = factory.createElement("MyToken", "acme", "http://www.acme.com");
        //Add the Id attribute
        tokElement.addAttribute(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", "utl"), gstFactory.createUniqueId());
    
        //Create the Email element
        SOAPElement emailElement = factory.createElement("Email", "acme", "http://www.acme.com");
        emailElement.addTextNode("joe.smith@acme.com");
    
        //Add the EMail element to the MyToken
        tokElement.addChildElement(emailElement);
    
        return tokElement;
      }
    
      public boolean logout() throws LoginException {
        return false;
      } 
      public boolean abort() throws LoginException {
        return false;
      }
      public boolean commit() throws LoginException {
        return true;
      }
    }
  2. 다음 이용자 JAAS 로그인 모듈을 작성하고 사용자의 애플리케이션 코드에 맞게 수정하여 사용하십시오.
    package test.tokens;
    
    import java.util.Map;
    import javax.xml.namespace.QName;
    import org.apache.axiom.om.OMElement;
    import javax.security.auth.Subject;
    import javax.security.auth.callback.Callback;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    import com.ibm.websphere.wssecurity.callbackhandler.PropertyCallback;
    import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
    import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
    import com.ibm.wsspi.wssecurity.wssapi.OMStructure;
    
    public class MyCustomConsumer implements LoginModule {
    
      private CallbackHandler _handler;
      private Map _sharedState;
    
      public void initialize(Subject subject, CallbackHandler callbackHandler,
                             Map<String, ?> sharedState, Map<String, ?> options) {
        this._handler = callbackHandler;
        this._sharedState = sharedState;
      }
    
      public boolean login() throws LoginException {
        PropertyCallback propertyCallback = new PropertyCallback(null);
        Callback[] callbacks = new Callback[] { propertyCallback};
    
        try {
          this._handler.handle(callbacks);
        } catch (Exception e) {
          throw new LoginException(e.toString());
        }
        //Get the GenericSecurityTokenFactory
        GenericSecurityTokenFactory factory = null;
        try {
          factory = GenericSecurityTokenFactory.getInstance();
        } catch (Exception e) {
          throw new LoginException(e.toString());
        }
        if (factory == null) {
          throw new LoginException("GenericSecurityTokenFactory.getInstance() returned null");
        }
        //Get the token that was consumed by the GenericIssuedConsumeLoginModule
        SecurityToken myToken = factory.getConsumerTokenFromSharedState(_sharedState, 
                                                                        new QName("http://www.acme.com","MyToken"));
    
        if (myToken == null) {
          throw new LoginException("no token");
        }
    
        //Get the token's element
        Object obj = myToken.getXML();
        if (obj == null) {
          throw new LoginException("token is empty");
        }
        if (!(obj instanceof OMStructure)) {
          throw new LoginException("XML is not OMStructure");
        }
        OMElement tokenElement = ((OMStructure)obj).getNode();
        //you can use the org.apache.axis2.util.XMLUtils.toDOM method
        //if you want to work with the a w3c.dom element instead of an
        //Axiom element
    
        //Do some processing on the contents of the token element
        OMElement el = tokenElement.getFirstChildWithName(new QName("http://www.acme.com","Email"));
        if (el == null) {
          throw new LoginException("no email element");
        }
        String value = el.getText();
    
        if (value != null && value.equals("joe.smith@acme.com")) {
          return true;
                } else {
          throw new LoginException("email value is bad");
        }
      }
      public boolean commit() throws LoginException {
        return true;
      }
      public boolean logout() throws LoginException {
        return false;
      }
      public boolean abort() throws LoginException {
        return false;
      }
    
    }
  3. 새 JAAS 로그인 구성을 작성하십시오.
    1. 관리 콘솔에서 보안->글로벌 보안을 선택하십시오.
    2. 인증에서 JAAS(Java Authentication and Authorization Service)를 선택하십시오.
    3. 시스템 로그인을 선택하십시오.
    4. 사용자 정의 모듈이 있는 생성기를 먼저 작성하십시오.
      1. 새로 작성을 클릭한 다음 Alias = test.generate.custom을 지정하십시오.
      2. 새로 작성을 클릭한 다음 Module class name = test.tokens.MyCustomGenerator를 지정하십시오.
      3. 로그인 모듈 프록시 사용을 선택하십시오.
      4. 확인을 클릭하십시오.
      5. 새로 작성을 클릭한 다음 Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule을 선택하십시오.
      6. 확인을 클릭하십시오.
      7. JAAS - 시스템 로그인을 클릭하십시오.
    5. 마지막으로 사용자 정의 모듈이 있는 이용자를 작성하십시오.
      1. 새로 작성을 클릭한 다음 Alias = test.consume.custom을 지정하십시오.
      2. 새로 작성을 클릭한 다음 Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenConsumeLoginModule을 선택하십시오.
      3. 새로 작성을 클릭한 다음 Module class name = test.tokens.MyCustomConsumer를 지정하십시오.
      4. 로그인 모듈 프록시 사용을 선택하십시오.
      5. 확인을 클릭하십시오.
    6. 저장을 클릭하십시오.
  4. 사용자 정의 정책 세트를 작성하십시오.
    1. 관리 콘솔에서 서비스 > 정책 세트 > 애플리케이션 정책 세트를 클릭하십시오.
    2. 새로 작성을 클릭한 다음 ACustomTokenPolicy를 지정하십시오.
    3. 적용을 클릭하십시오.
    4. 정책에서 추가 > WS-Security를 클릭하십시오.
  5. 사용자 정의 정책 세트를 편집하십시오.
    1. 관리 콘솔에서 WS-Security > 기본 정책을 클릭하십시오.
    2. 원하지 않는 요소는 다음과 같이 제거하십시오.
      1. 보안 헤더에 시간소인 포함을 선택 취소하십시오.
      2. 메시지 레벨 보호를 선택 취소하십시오.
    3. 사용자 정의 토큰을 추가하십시오.
      1. 토큰 정책 요청을 클릭하십시오.
      2. 토큰 유형 추가 > 사용자 정의를 클릭한 후 다음을 지정하십시오.
        • Custom token name = myToken
        • Local part = MyToken
        • Namespace URI = http://www.acme.com
      3. 확인을 클릭하십시오.
    4. 저장을 클릭하십시오.
  6. ACustomTokenPolicy 정책 세트를 사용하도록 클라이언트를 구성하십시오.
    1. 관리 콘솔에서 서비스 > 서비스 클라이언트를 클릭하십시오.
    2. 원하는 서비스 클라이언트를 클릭하십시오.
    3. 최상위 레벨에서 자원을 선택하십시오.
    4. 정책 세트 첨부를 클릭하십시오.
    5. ACustomTokenPolicy를 선택하십시오.
  7. 클라이언트에 대한 사용자 정의 바인딩을 작성하십시오.
    1. 최상위 레벨에서 다시 자원을 선택하십시오.
    2. 바인딩 지정을 클릭하십시오.
    3. 애플리케이션-특성 바인딩을 작성하기 위해 새 애플리케이션 특정 바인딩을 클릭하십시오.
    4. 바인딩 구성 이름을 지정하십시오.

      이름: customTokenClientBinding

    5. 추가 > WS-Security를 클릭하십시오.

      기본 메시지 보안 정책 바인딩 패널이 표시되지 않으면 WS-Security를 선택하십시오.

  8. 클라이언트의 사용자 정의 바인딩을 구성하십시오.
    1. 인증 및 보호 > request:myToken을 선택하십시오.
    2. JAAS login = test.generate.custom을 선택하십시오.
    3. 적용을 클릭하십시오.
    4. 콜백 핸들러를 클릭하십시오.
    5. passThroughToken=true 사용자 정의 특성을 추가하십시오.
  9. ACustomTokenPolicy 정책 세트를 사용하도록 제공자를 구성하십시오.
    1. 관리 콘솔에서 서비스 > 서비스 제공자를 클릭하십시오.
    2. 원하는 서비스 제공자를 클릭하십시오.
    3. 최상위 레벨에서 자원을 선택하십시오.
    4. 정책 세트 첨부를 클릭하십시오.
    5. ACustomTok enPolicy를 선택하십시오.
  10. 제공자에 대한 사용자 정의 바인딩을 작성하십시오.
    1. 최상위 레벨에서 다시 자원을 선택하십시오.
    2. 바인딩 지정을 클릭하십시오.
    3. 애플리케이션-특성 바인딩을 작성하기 위해 새 애플리케이션 특정 바인딩을 클릭하십시오.
    4. 바인딩 구성 이름을 지정하십시오.

      customTokenProviderBinding

    5. 추가 > WS-Security를 클릭하십시오.

      기본 메시지 보안 정책 바인딩 패널이 표시되지 않으면 WS-Security를 선택하십시오.

  11. 제공자의 사용자 정의 바인딩을 구성하십시오.
    1. 인증 및 보호 > request:myToken을 선택하십시오.
    2. JAAS login = test.consume.custom을 선택하십시오.
    3. 적용을 클릭하십시오.
    4. 콜백 핸들러를 클릭하십시오.
    5. passThroughToken=truealwaysGeneric=true 사용자 정의 특성을 추가하십시오.
  12. 저장을 클릭하여 구성 변경사항을 저장하십시오.
  13. 애플리케이션 서버를 다시 시작하여 JAAS 구성 변경사항을 적용하십시오.
  14. 서비스를 테스트하십시오.

다음 예에서는 이전 프로시저를 따르는 경우 생성되는 SOAP 보안 헤더를 보여줍니다.

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
    <acme:MyToken xmlns:acme="http://www.acme.com" xmlns:utl="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" utl:Id="cust_3">
        <acme:Email>joe.smith@acme.com</acme:Email>
    </acme:MyToken>
</wsse:Security>

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



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