일반 발행 로그인 모듈을 사용한 사용자 정의 토큰 생성 및 이용
일반 발행 토큰 생성기 및 이용자인 GenericIssuedTokenGenerateLoginModule 및 GenericIssuedTokenConsumeLoginModule은 GenericSecurityTokenFactory 및 GenericSecurityToken SPIs와 함께 사용자 정의 토큰에 대한 엔드 투 엔드 솔루션을 구현하는 데 사용할 수 있습니다. 일반 발행 로그인 모듈을 사용한 사용자 정의 토큰 생성 및 이용은 정책 및 바인딩 또는 WSSAPI를 사용하여 수행될 수 있습니다.
시작하기 전에
새 JAAS 로그인 모듈 클래스를 추가할 수 있는 JAX-WS 서비스 클라이언트와 제공자 애플리케이션의 작동하는 세트가 있어야 합니다.
이 태스크 정보
세트 JAX-WS 서비스 클라이언트와 제공자 애플리케이션이 사용자 정의 토큰을 사용할 수 있도록 하려면 다음 단계를 따르십시오. 이러한 단계에서 MyToken은 작성 중인 토큰의 이름입니다.
이 태스크를 완료하면:
- 토큰 생성 및 토큰 이용을 위한 두 개의 JAAS 로그인 모듈이 작성됩니다.
- 일반 발생 토큰 이용자 및 생성기의 지원을 통해 토큰이 생성되고 이용됩니다.
- 그러면 정책 세트 및 바인딩이 있는 애플리케이션에 보안 제한조건이 적용됩니다.
프로시저
- 다음 생성기 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; } }
- 다음 이용자 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; } }
- 새 JAAS 로그인 구성을 작성하십시오.
- 관리 콘솔에서 보안->글로벌 보안을 선택하십시오.
- 인증에서 JAAS(Java Authentication and Authorization Service)를 선택하십시오.
- 시스템 로그인을 선택하십시오.
- 사용자 정의 모듈이 있는 생성기를 먼저 작성하십시오.
- 새로 작성을 클릭한 다음 Alias = test.generate.custom을 지정하십시오.
- 새로 작성을 클릭한 다음 Module class name = test.tokens.MyCustomGenerator를 지정하십시오.
- 로그인 모듈 프록시 사용을 선택하십시오.
- 확인을 클릭하십시오.
- 새로 작성을 클릭한 다음 Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenGenerateLoginModule을 선택하십시오.
- 확인을 클릭하십시오.
- JAAS - 시스템 로그인을 클릭하십시오.
- 마지막으로 사용자 정의 모듈이 있는 이용자를 작성하십시오.
- 새로 작성을 클릭한 다음 Alias = test.consume.custom을 지정하십시오.
- 새로 작성을 클릭한 다음 Module class name = com.ibm.ws.wssecurity.wssapi.token.impl.GenericIssuedTokenConsumeLoginModule을 선택하십시오.
- 새로 작성을 클릭한 다음 Module class name = test.tokens.MyCustomConsumer를 지정하십시오.
- 로그인 모듈 프록시 사용을 선택하십시오.
- 확인을 클릭하십시오.
- 저장을 클릭하십시오.
- 사용자 정의 정책 세트를 작성하십시오.
- 관리 콘솔에서 서비스 > 정책 세트 > 애플리케이션 정책 세트를 클릭하십시오.
- 새로 작성을 클릭한 다음 ACustomTokenPolicy를 지정하십시오.
- 적용을 클릭하십시오.
- 정책에서 추가 > WS-Security를 클릭하십시오.
- 사용자 정의 정책 세트를 편집하십시오.
- 관리 콘솔에서 WS-Security > 기본 정책을 클릭하십시오.
- 원하지 않는 요소는 다음과 같이 제거하십시오.
- 보안 헤더에 시간소인 포함을 선택 취소하십시오.
- 메시지 레벨 보호를 선택 취소하십시오.
- 사용자 정의 토큰을 추가하십시오.
- 토큰 정책 요청을 클릭하십시오.
- 토큰 유형 추가 > 사용자 정의를 클릭한 후 다음을 지정하십시오.
- Custom token name = myToken
- Local part = MyToken
- Namespace URI = http://www.acme.com
- 확인을 클릭하십시오.
- 저장을 클릭하십시오.
- ACustomTokenPolicy 정책 세트를 사용하도록 클라이언트를 구성하십시오.
- 관리 콘솔에서 서비스 > 서비스 클라이언트를 클릭하십시오.
- 원하는 서비스 클라이언트를 클릭하십시오.
- 최상위 레벨에서 자원을 선택하십시오.
- 정책 세트 첨부를 클릭하십시오.
- ACustomTokenPolicy를 선택하십시오.
- 클라이언트에 대한 사용자 정의 바인딩을 작성하십시오.
- 최상위 레벨에서 다시 자원을 선택하십시오.
- 바인딩 지정을 클릭하십시오.
- 애플리케이션-특성 바인딩을 작성하기 위해 새 애플리케이션 특정 바인딩을 클릭하십시오.
- 바인딩 구성 이름을 지정하십시오.
이름: customTokenClientBinding
- 추가 > WS-Security를 클릭하십시오.
기본 메시지 보안 정책 바인딩 패널이 표시되지 않으면 WS-Security를 선택하십시오.
- 클라이언트의 사용자 정의 바인딩을 구성하십시오.
- 인증 및 보호 > request:myToken을 선택하십시오.
- JAAS login = test.generate.custom을 선택하십시오.
- 적용을 클릭하십시오.
- 콜백 핸들러를 클릭하십시오.
- passThroughToken=true 사용자 정의 특성을 추가하십시오.
- ACustomTokenPolicy 정책 세트를 사용하도록 제공자를 구성하십시오.
- 관리 콘솔에서 서비스 > 서비스 제공자를 클릭하십시오.
- 원하는 서비스 제공자를 클릭하십시오.
- 최상위 레벨에서 자원을 선택하십시오.
- 정책 세트 첨부를 클릭하십시오.
- ACustomTok enPolicy를 선택하십시오.
- 제공자에 대한 사용자 정의 바인딩을 작성하십시오.
- 최상위 레벨에서 다시 자원을 선택하십시오.
- 바인딩 지정을 클릭하십시오.
- 애플리케이션-특성 바인딩을 작성하기 위해 새 애플리케이션 특정 바인딩을 클릭하십시오.
- 바인딩 구성 이름을 지정하십시오.
customTokenProviderBinding
- 추가 > WS-Security를 클릭하십시오.
기본 메시지 보안 정책 바인딩 패널이 표시되지 않으면 WS-Security를 선택하십시오.
- 제공자의 사용자 정의 바인딩을 구성하십시오.
- 인증 및 보호 > request:myToken을 선택하십시오.
- JAAS login = test.consume.custom을 선택하십시오.
- 적용을 클릭하십시오.
- 콜백 핸들러를 클릭하십시오.
- passThroughToken=true 및 alwaysGeneric=true 사용자 정의 특성을 추가하십시오.
- 저장을 클릭하여 구성 변경사항을 저장하십시오.
- 애플리케이션 서버를 다시 시작하여 JAAS 구성 변경사항을 적용하십시오.
- 서비스를 테스트하십시오.
예
다음 예에서는 이전 프로시저를 따르는 경우 생성되는 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>


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_gen_consum_custtokens
파일 이름:twbs_gen_consum_custtokens.html