2016-03-21 42 views
1

我需要使用apache WSS4J 1.5进行一些SOAP签名/验证,但是我无法跳过/禁用UsernameToken密码验证。WSS4j 1.5:如何跳过密码验证?

在WSS4J 1.6+中,我能够将安全引擎配置为使用NoOpValidator()类跳过用户名令牌认证,但1.5不具备此支持。

有什么办法可以告诉WSS4J 1.5完全跳过用户名/密码验证路由吗?

回答

0

更深入一点在WSSecEngine类周围挖掘后,我发现我需要的不是一个的CallBackHandler,但跳过处理的定制处理器的UsernameToken对象:

 WSSecurityEngine secEngine = new WSSecurityEngine(); 
     WSSConfig wsConfig = WSSConfig.newInstance(); 
     wsConfig.setProcessor(UsernameToken.TOKEN, new Processor() { 

      @Override 
      public void handleToken(Element arg0, Crypto arg1, Crypto arg2, CallbackHandler arg3, WSDocInfo arg4, Vector arg5, WSSConfig arg6) 
        throws WSSecurityException { 
       // skip the token processing 
       logger.debug("Skipping processing of the username token"); 
      } 

      @Override 
      public String getId() { 
       return null; 
      } 
     }); 
     secEngine.setWssConfig(wsConfig); 

虽然WSS4J 1.5是非常古老的,但希望这可能会希望别人在未来。

WSS4J 1.6+改变了这些处理器使用Validator的方式。

1

您需要编写自己的回调处理程序实现以跳过加载LoginContext。然后可以从系统属性加载处理程序类。

从javax.security.auth.callback.CallbackHandler的的源代码指,

默认的CallbackHandler类实现可以在 auth.login.defaultCallbackHandler安全属性来指定。

可以在位于名为/lib/security/java.security的文件中的Java安全属性文件 中设置安全属性。 引用java.home系统属性的值,并且 指定安装JRE的目录。

如果安全属性设置为一个 CallbackHandler实现类的完全合格的名称,然后一个LoginContext将加载 指定CallbackHandler,并将它传递给底层 的LoginModule。

如果LoginContext没有提供 之一,则它只加载默认处理程序。所有默认的处理程序实现都必须提供一个公共的 零参数构造函数。

另外要注意的一些风险,自带WSS4J 1.5.XX

+0

我仍然有点困惑如何注册回调处理程序。我查看了'UsernameTokenProcessor'的源代码,但是当它在这里查看回调处理程序时,它已经在比较返回的密码。我需要阻止WSS4J甚至试图处理UsernameToken,但我不完全确定回调处理程序应该是什么或应该如何注册。你知道这是否有任何文档/例子吗?我意识到WSS4J 1.5已经很老了,我所能找到的所有文档都是针对WSS4J 2+的。 –

+0

好的 - 所以我在代码中多挖一下,看到它不是我需要的CallbackHandler,而是一个定制处理器。 –