我知道Apache Rampart配置允许提供密码回调处理程序类,可用于提供Rampart引擎构建用户名令牌和发送邮件时创建签名所需的密码。 编写的是,每当Rampart Engine需要密码来创建用户名令牌时,它将创建一个WSPasswordCallback实例,设置从Rampart配置的参数中提取的相应标识符,并通过handle方法将其传递给密码回调类。但正如您所见,我已经使用了基于策略的配置!
所以我有几个问题要看看我是否理解了这一切:
我是否从这里开始使用垒阵引擎提取相应的用户名 - wsse:Username>bob</wsse:Username>'+
在提取之后,它通过handle方法将它传递给我们的PWCBHandler类。 如果用户名正确,我们的handle方法设置适当的密码。
最重要的是 - 因为我必须在最后通过javascript使用我的网络服务,所以我提供了肥皂请求。但是你看到我提供了用户名和密码,我无法看到安全性在哪里,因为每个人都可以看到我的用户名和密码。这是正确的吗。我怎样才能让它更安全。
这是我的代码。
这是我的PassWordCallback.java类的代码
ublic void handle(Callback [] callbacks)抛出IOException,UnsupportedCallbackException { for(int i = 0; i&lt; callbacks.length; i ++){
WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i];
if(pwcb.getIdentifier().equals("test") &&pwcb.getPassword().equals("pass")) {
return;
}
else {
throw new UnsupportedCallbackException(callbacks[i],"Incorrect login/password");
}
}
}
这是来自javascript的soaprequest
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soapenv:Envelope " +
"xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:tan=\"http://tan\">"+
"<soapenv:Header>"+
'<wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" soapenv:mustUnderstand="1">'+
'<wsse:UsernameToken xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="123">'+
'<wsse:Username>bob</wsse:Username>'+
'<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>'+
'</wsse:UsernameToken>'+
'</wsse:Security>'+
"</soapenv:Header>"+
"<soapenv:Body>" +
"<tan:testws>" +
'<tan:x>ECHOO</tan:x>' +
' </tan:testws>'+
'</soapenv:Body>' +
'</soapenv:Envelope>';
答案 0 :(得分:2)
我会先回答你的第3个问题
您正在使用用户名令牌身份验证方法来验证服务。要提供安全性,您需要使用https transport而不是http。这样您就可以提供传输级安全性并隐藏密码。在http://wso2.com/library/3190/
可以找到一些不错的阅读材料如果您使用不安全的频道(比如http),那么您可以加密密码。用户可以使用随机字节(nounce)创建密码摘要。要对请求进行身份验证,服务将使用绑定到接收的用户名的密码计算摘要值,并将比较接收的摘要值和计算的摘要值。安全标头将被更改。关于此,可以找到一些详细信息。 http://wso2.com/library/240/。为了提供更多安全性,您可以加密消息(http://wso2.com/library/3415/)
对于问题1,它不会从wsse:Username获取用户名。它从Rampart配置的参数中提取用户名。可以在外部或使用java
加载此配置RampartConfig rc = new RampartConfig();
rc.setUser("admin");
rc.setPwCbClass(PWDCallBackHandler.class.getName());
有关回调处理程序http://wso2.com/library/3733/
的一些信息问题2:是的