gpt4 book ai didi

java - 使用 Metro + WSIT 在服务端点检索明文 WS-Security 密码?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:18 25 4
gpt4 key购买 nike

我正在编写一个充当某种“转发代理”的 SOAP 服务(我们称它为 X),替换正文中的几个元素,然后调用另一个 SOAP 服务 (Y)。我想使用调用 Y 时在 X 中收到的相同 WS-Security 凭据(纯文本 用户名和密码),但我无法检索密码元素的值。

我在 wsit-package.service.xml 中声明的政策文件引用了 com.sun.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidator 的实现:

<wsp1_2:Policy wsu:Id="UsernameToken" 
xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:wsss="http://schemas.sun.com/2006/03/wss/server"
xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy">
<wsp1_2:ExactlyOne>
<wsp1_2:All>
<sp:SupportingTokens>
<wsp1_2:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/
ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient" />
<sp:IncludeTimestamp />
</wsp1_2:Policy>
</sp:SupportingTokens>
<wsss:ValidatorConfiguration wspp:visibility="private" >
<wsss:Validator name="usernameValidator"
classname="com.service.validator.SecurityValidator" />
</wsss:ValidatorConfiguration>
</wsp1_2:All>
</wsp1_2:ExactlyOne>
</wsp1_2:Policy>

我能够在 validator 中访问密码:

@Override
public boolean validate(Request request) throws PasswordValidationException {
String password = ((PlainTextPasswordRequest) request).getPassword();
return true;
}

但是,由于 validator 无权访问 WebServiceContext,因此没有一个方便的地方来存储它以供我的服务端点访问。

与其他 header ,例如WS-Addressing,我能够使用处理程序(SOAPHandler<SOAPMessageContext> 的实现)提取值,然后将它们放回应用程序范围下的上下文中,以便我的端点检索。当 SOAP 消息到达我的处理程序链时,WS-Security header 已经被剥离,因此无法在处理程序中检索它们的值。

除了使用 validator 将密码存储在数据库/全局映射/线程本地存储中这样极端的事情之外,我有什么方法可以检索在我的端点提供的 WS-Security 密码吗?

我应该注意到,我能够通过 Subject subj = SubjectAccessor.getRequesterSubject(context) 在我的端点访问 WS-Security 用户名信息。 ,但这似乎不包含密码。

最佳答案

由于缺乏更好的解决方案,我最终使用 ThreadLocal 存储来访问我的服务端点中的 WS-Security 用户名和密码:

package com.my.ws.validator;

import com.sun.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidationException;
import com.sun.xml.wss.impl.callback.PasswordValidationCallback.PasswordValidator;
import com.sun.xml.wss.impl.callback.PasswordValidationCallback.PlainTextPasswordRequest;
import com.sun.xml.wss.impl.callback.PasswordValidationCallback.Request;

public class SecurityValidator implements PasswordValidator {

private static final ThreadLocal<String> username = new ThreadLocal<String>();
private static final ThreadLocal<String> password = new ThreadLocal<String>();

@Override
public boolean validate(final Request request) throws PasswordValidationException {

if (request instanceof PlainTextPasswordRequest) {
PlainTextPasswordRequest plainText = (PlainTextPasswordRequest) request;

if (null == plainText.getUsername() || plainText.getUsername().trim().isEmpty())
throw new PasswordValidationException("A username must be provided");
else
username.set(plainText.getUsername());

if (null == plainText.getPassword() || plainText.getPassword().trim().isEmpty())
throw new PasswordValidationException("A password must be provided");
else
password.set(plainText.getPassword());

return true;
}

return false;
}

public static String getUsername() {
String user = username.get();
username.remove();
return user;
}

public static String getPassword() {
String pass = password.get();
password.remove();
return pass;
}

}

关于java - 使用 Metro + WSIT 在服务端点检索明文 WS-Security 密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com