2017-03-14 7 views
1

要求されたUsernameTokenでセキュリティトークンサービス(サーバー側)を実装しようとしましたが、サービスがcxfによって生成されたトークンに応答する必要があります。 私はJAVA、SpringBoot、Javaベースの設定を使用します。トークンストアを持つCXFカスタムセキュリティトークンプロバイダ

カスタムトークンプロバイダを実装し、cxfのデフォルトのトークンストアを使用するにはいくつかの問題があります。

マイカスタム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> 

tokenstoreとカスタムSCTプロバイダをどのように含めることができますか?

+0

あなたの問題を解決できましたか? – 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が設定されませんでした。そこで別のアプローチを試みました。代わりに、私はバスの設定にそのエントリを追加編集エンドポイントの:あなたの質問については

<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"/> 

を、私はあなたの構文は次のようになり信じる:

@EndpointProperty(key = "org.apache.cxf.ws.security.tokenstore.TokenStore", ref="bean-name") 
関連する問題