WS-Security Cap 6

121 views
Skip to first unread message

Gabriel Melo

unread,
Jun 6, 2013, 1:27:54 PM6/6/13
to soa-ap...@googlegroups.com
Boa tarde Alexandre,

estou seguindo as instruções do CAP 6 do livro (WS-Security) para implementar a segurança em um webservice que estou desenvolvendo. Aparentemente tudo certo, mas quando rodo o teste pelo SOAP UI é exibido um erro de cast no Handler CallbackSegurança. Já tentei de tudo, se alguém puder ajudar agradeço. Segue o erro:

14:10:06,116 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (http-localhost-127.0.0.1-8443-1) Interceptor for {http://servicos.estoque.knight.com/}AutoresServiceService has thrown exception, unwinding now: java.lang.ClassCastException: org.apache.ws.security.WSPasswordCallback cannot be cast to org.apache.ws.security.WSPasswordCallback at com.knight.estoque.servicos.seguranca.CallbackSeguranca.handle(CallbackSeguranca.java:30) [classes:]
at org.apache.ws.security.validate.UsernameTokenValidator.verifyDigestPassword(UsernameTokenValidator.java:168) [wss4j-1.6.10.jar:1.6.10]
at org.apache.ws.security.validate.UsernameTokenValidator.verifyPlaintextPassword(UsernameTokenValidator.java:142) [wss4j-1.6.10.jar:1.6.10]
...

Método que gera o erro:

public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {

               for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
System.out.println("Não sei pq, mas nao está entrando neste ponto 
                                                            mesmo o callbacks[i] sendo um WSPasswordCallback");
}
//Nao consegue realizar o cast mesmo sendo um WSPasswordCallback
Line 30: WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
String pass = passwords.get(pc.getIdentifier());
if (pass != null) {
pc.setPassword(pass);
return;
}
}
}


Obrigado!

Alexandre Saudate

unread,
Jun 6, 2013, 1:40:25 PM6/6/13
to soa-ap...@googlegroups.com
Boa tarde, Gabriel!

Esse tipo de erro geralmente acontece quando existem duas versões da mesma classe no classpath. Você incluiu alguma versão da biblioteca wss4j no seu projeto?

Se você consultar o github com o código fonte, vai notar que eu incluí a seguinte configuração no Maven:

<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.6.5</version>
<scope>provided</scope>
</dependency>

O escopo "provided" significa que o pacote todo vai ser compilado com a biblioteca, mas ela será removida na hora de empacotar tudo - ou seja, ela vai estar presente no servidor apenas, e não no .war.

[]'s




--
Você está recebendo esta mensagem porque se inscreveu no grupo "SOA Aplicado" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para soa-aplicado...@googlegroups.com.
Para postar neste grupo, envie um e-mail para soa-ap...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/soa-aplicado?hl=pt-BR.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Gabriel Melo

unread,
Jun 6, 2013, 2:19:20 PM6/6/13
to soa-ap...@googlegroups.com
Boa tarde, Alexandre.

É um projeto não Maven. Criei um Dynamic Web. Removi aqui a LIB wss4j, só está o JBoss 7.1 Runtime no meu classpath. Agora ele está dando um erro de classnotfound :( 

15:09:36,382 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/soa-cap03-v1].[AutoresService]] (http-localhost-127.0.0.1-8443-1) Servlet.service() for servlet AutoresService threw exception: java.lang.ClassNotFoundException: org.apache.ws.security.WSPasswordCallback from [Module "deployment.soa-cap03-v1.war:main" from Service Module Loader]

Alexandre Saudate

unread,
Jun 6, 2013, 2:27:47 PM6/6/13
to soa-ap...@googlegroups.com
Agora, o problema é outro: seu WAR precisa dizer ao JBoss que ele tem estas dependências (infelizmente, elas não são automaticamente ativadas pelo JBoss se você não declarar).

Para fazer isso, você precisa colocar no MANIFEST do seu WAR a seguinte linha:

Dependencies: org.apache.ws.security,org.jboss.ws.api,org.jboss.resteasy.resteasy-jaxrs

(Observe, pelo pom.xml do projeto no github, que estas modificações são feitas via Maven)

[]'s
Message has been deleted
Message has been deleted

Alexandre Saudate

unread,
Jun 7, 2013, 9:46:24 AM6/7/13
to soa-ap...@googlegroups.com
Gabriel,

Isso varia de ferramenta para ferramenta. Nesse ponto, o JBoss de fato peca bastante, pois não tem nenhuma ferramenta para isso. O Oracle, por exemplo, tem policies já pré-definidas que podem ser instaladas com anotações. 

[]'s


Em 7 de junho de 2013 08:38, Gabriel Melo <gabri...@gmail.com> escreveu:
Bom dia, Alexandre! Só mais uma dúvida:
Percebi que temos que definir o WSDL manualmente através do atributo wsdlLocation e declarar a nossa policy dentro desse WSDL. Existe alguma forma dessa WSDL ser gerada automaticamente e definirmos a policy de alguma outra forma ou teremos sempre que estar atualizando a WSDL manualmente?

Grato.
Reply all
Reply to author
Forward
0 new messages