我需要使用apache WSS4J 1.5进行一些SOAP签名/验证,但是我在跳过/禁用UsernameToken密码验证时遇到了问题。
在WSS4J 1.6+中,我能够配置安全引擎以使用NoOpValidator()类跳过用户名令牌身份验证,但1.5没有此支持。
有没有办法告诉WSS4J 1.5完全跳过用户名/密码验证路由?
答案 0 :(得分:1)
你需要编写自己的回调处理程序实现来跳过加载LoginContext
。然后可以从系统属性加载该处理程序类。
引用 javax.security.auth.callback.CallbackHandler 的源代码,
可以在。中指定默认的CallbackHandler类实现 auth.login.defaultCallbackHandler 安全属性。
可以在Java安全属性文件中设置security属性 位于名为/lib/security/java.security的文件中。 指的是java.home系统属性的值,和 指定安装JRE的目录。
如果安全属性设置为a的完全限定名称 CallbackHandler实现类,然后将加载一个LoginContext 指定的CallbackHandler并将其传递给底层 LoginModule的。
如果未提供默认处理程序,则LoginContext仅加载默认处理程序 一。所有默认处理程序实现都必须提供公共 零参数构造函数。
还要注意WSS4J 1.5.XX
带来的一些风险答案 1 :(得分: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+改变了这些处理器与Validators的协同工作方式。