2017-03-14 6 views
1

요청한 UsernameToken을 사용하여 보안 토큰 서비스 (서버 쪽)를 구현하려고하며 서비스가 cxf에 의해 생성 된 응답 토큰을 응답해야합니다. JAVA, Spring Boot 및 Java 기반 구성을 사용합니다.CXF 토큰 저장소가있는 CXF 사용자 지정 보안 토큰 공급자

사용자 지정 토큰 공급자를 구현하고 cxf에서 기본 tokenstore를 사용하는 데 몇 가지 문제가 있습니다.

내 사용자 정의 SCTProvider :

public class BiPROTokenProvider extends SCTProvider{ 

private static final String WSC_IDENTIFIER = "wsc:Identifier"; 
private static final String BIPRO_PRAEFIX = "bipro:"; 

@Override 
public TokenProviderResponse createToken(TokenProviderParameters tokenParameters) { 
    TokenProviderResponse response = super.createToken(tokenParameters); 

    String biproId = BIPRO_PRAEFIX + response.getTokenId().split(":")[1]; 


    //NodeList identifier = ((Element) response.getToken()).getElementsByTagName(WSC_IDENTIFIER); 
    //identifier.item(0).setTextContent(biproId); 
    //Element identifier = response.getTokenId().getElementsByTagName(WSC_IDENTIFIER); 

    //super.createToken(tokenParameters).setTokenId(biproId); 
    response.setTokenId(biproId); 

    return response; 
} 

}

내 첫 번째 문제는 내가 내 사용자 지정 SCT 공급자를 포함해야한다 어디 모르는입니까? - 내 엔드 포인트에서 게시 할 수 있습니까?

@Bean 
    public Endpoint endpoint() { 
    EndpointImpl endpoint = new EndpointImpl(springBus(), securityTokenServicePortType()); 
    endpoint.setServiceName(securityTokenService26010().getServiceName()); 
     endpoint.setWsdlLocation(securityTokenService26010().getWSDLDocumentLocation().toString()); 
    endpoint.publish("/SecurityTokenService-2.6.0.1.0"); 
    endpoint.getOutFaultInterceptors().add(soapInterceptor()); 
    return endpoint; 
    } 
    @Bean 
    public DefaultInMemoryTokenStore defaulttokenStore(){ 
    return new DefaultInMemoryTokenStore(); 
    } 
    @Bean 
    SCTProvider customSCTProvider(){ 
    return new BiPROTokenProvider(); 
    } 

두 번째 문제 : 내가 CXF에서 기본 tokenstore 내 생성 된 토큰을 저장할 . 나는 토큰 가게에 대해 뭔가 읽었다. http://cxf.apache.org/docs/ws-securitypolicy.html 제 생각에는 서비스 구현의 enpointproperties에 tokenstore를 포함시켜야합니다.

@WebService 
    (
     portName = "wst:UserPasswordLogin", 
     serviceName = "SecurityTokenService_2.6.0.1.0", 
     wsdlLocation = "src/main/resources/wsdl/SecurityTokenService- 2.6.0.1.0.wsdl", 
     endpointInterface = "net.bipro.namespace.SecurityTokenServicePortType" 
     ) 
@EndpointProperties({ 

@EndpointProperty(key = "ws-security.callback-handler", value="com.muki.endpoint.STSCallbackHandler"), 
//@EndpointProperty(key = "ws-security.add.inclusive.prefixes", value="false"), 
@EndpointProperty(key = "org.apache.cxf.ws.security.tokenstore.TokenStore", value="TOKEN_STORE_CACHE_INSTANCE"), 
    }) 
    public class SecurityTokenEndpoint implements SecurityTokenServicePortType { 
    ... 
    } 

그러나 엔드 포인트 속성을 통해 토큰 저장소를 포함하면 다음 오류가 발생합니다.

<faultstring>java.lang.String cannot be cast to org.apache.cxf.ws.security.tokenstore.TokenStore</faultstring> 

누구든지 토큰 스토어와 사용자 정의 SCT 공급자를 어떻게 포함시킬 수 있습니까?

+0

이 문제를 해결하기 위해 당신이 할 수 있었 : 귀하의 질문에 관해서는

<cxf:bus> <cxf:properties> <entry key="org.apache.cxf.ws.security.tokenstore.TokenStore" value-ref="tokenStore" /> </cxf:properties> </cxf:bus> <bean id="tokenStore" class="org.apache.cxf.ws.security.tokenstore.MemoryTokenStore"/> 

을, 당신의 구문은 다음과 같을 것이다 생각? – Kamil

답변

0

비슷한 문제가 있었지만 xml 구성을 사용했습니다. 대신 value의 나는 value-ref을 사용하고 거기에 콩을 통과 :

<jaxws:endpoint 
    id="endpointId" 
    address="/foo/bar" 
    ... 
    serviceName="ns1:ServiceName"> 
    <jaxws:properties> 
     ... 
     <entry key="org.apache.cxf.ws.security.tokenstore.TokenStore" value-ref="tokenStore" /> 
    </jaxws:properties> 
</jaxws:endpoint> 

<bean id="tokenStore" class="org.apache.cxf.ws.security.tokenstore.MemoryTokenStore"/> 

오류가 사라졌다하지만 제대로 작동하지 않는 - TokenStore가 설정되지 않았습니다. 그래서 나는 또 다른 접근법을 시도했다. 대신 편집 엔드 포인트의 내가 버스 설정에 해당 항목 추가 :

@EndpointProperty(key = "org.apache.cxf.ws.security.tokenstore.TokenStore", ref="bean-name")