Pregunta

Estoy utilizando la última Apache CXF para crear un servicio web. He configurado WS-Security utilizando org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor. En mi passwordCallbackClass puedo acceder el usuario o identificador llamando getIdentifier() método de la clase org.apache.ws.security.WSPasswordCallback.

También estoy usando primavera para toda la instalación.

Me gustaría saber cómo acceder al identificador de cualquier otro lugar en el código? Yo podría pensar en utilizar ThreadLocal en mi passwordCallbackClass? Otra forma en que se definen a una propiedad de identificador en todos mis parámetros del método de servicio, pero eso significaría cliente necesita pasar el identificador dos veces, una en el bloque de seguridad y de nuevo en la llamada de servicio?


Editar

Mi clase de servicio se parece a esto y tengo que leer el identificador de método sayHi.

@WebService(endpointInterface = "com.webservice.HelloWorld")  
public class HelloWorldImpl implements HelloWorld {  
    public String sayHi(String text) {  
        return "Hello " + text;  
    }  
}

Mi método de devolución de llamada contraseña es aquí donde puedo conseguir el identificador.

public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackExceptio {  
    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];  
    pc.getIdentifier();  
}
¿Fue útil?

Solución

He utilizado ThreadLocal en mi método de devolución de llamada contraseña para almacenar el identificador. entonces accedo a la ThreadLocal en cualquier parte del código para conocer el identificador.

Otros consejos

Definir "ningún otro lugar en el código"? ¿Estás hablando en otros interceptores? En su implementación del servidor? ¿Está utilizando JAXWS o la sencilla interfaz? Etc ...

Si se utiliza jaxws y quiere que en sus impl servidor, el JAXWS WebServiceContext tiene un método getUserPrincipal () que no sería más que un director que crea WSS4J después de validar el usuario.

Más o menos en otro sitio (o incluso en los impl servidor utilizando el contexto), se puede hacer algo como:

message.get (SecurityContext.class) .getUserPrincipal ();

para lograr el mismo resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top