Java 带有令牌存储的CXF自定义安全令牌提供程序

Java 带有令牌存储的CXF自定义安全令牌提供程序,java,spring-boot,soap,cxf,bipro,Java,Spring Boot,Soap,Cxf,Bipro,我尝试使用请求的UsernameToken实现安全令牌服务(服务器端),我的服务应该响应由cxf生成的令牌。 我使用JAVA、Spring引导和基于JAVA的配置 我在实现自定义令牌提供程序和使用cxf中的默认令牌存储时遇到一些问题 我的自定义SCTProvider: public class BiPROTokenProvider extends SCTProvider{ private static final String WSC_IDENTIFIER = "wsc:Identifier"

我尝试使用请求的UsernameToken实现安全令牌服务(服务器端),我的服务应该响应由cxf生成的令牌。 我使用JAVA、Spring引导和基于JAVA的配置

我在实现自定义令牌提供程序和使用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的默认令牌存储中。我读了一些关于代币店的东西。 在我看来,我必须在服务实现的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 {
  ...
  }
但是如果我通过端点属性包含tokenstore,我会收到以下错误

    <faultstring>java.lang.String cannot be cast to org.apache.cxf.ws.security.tokenstore.TokenStore</faultstring>
java.lang.String不能强制转换为org.apache.cxf.ws.security.tokenstore.tokenstore

有谁能帮助我如何包含令牌库和自定义SCT提供程序吗?

我也有类似的问题,但我使用xml配置。我没有使用
value
而是使用
value ref
并将bean传递到那里:

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

我也有类似的问题,但我使用xml配置。我没有使用
value
而是使用
value ref
并将bean传递到那里:

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

你能解决你的问题吗?你能解决你的问题吗?
@EndpointProperty(key = "org.apache.cxf.ws.security.tokenstore.TokenStore", ref="bean-name")