- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个充当某种“转发代理”的 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/
我正在使用 将文本显示在屏幕上 text.setText(text.getText().toString()+"binary message sent: "+ msg + "\n"); 如何从屏幕上删
我正在编写一个程序来 ping 服务器并返回一个值。 我一直在尝试将 ping 覆盖到 JFrame,其中 JLabel 在透明窗口中显示 ping。 但是,每次我调用方法 DrawOverlay()
我正在尝试从 JTextPane 中删除所有文本。我以为你可以简单地使用: textPane.setText(""); 这确实有效,但由于某种原因,调用该方法后总是有一个空行。为什么会这样?我该如何预
更新到新发布的 Xcode 7 版本后,我遇到了这个问题。 应用程序传输安全性已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用程序的 Info.plist 文件配置临时异
我试图在单击单选按钮时清除简单文本框中的文本。这是我的 CoffeeScript ... $("#selection_single").click -> $("#from_date_tex
复制代码 代码如下: Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd /c @runas /use
TortoiseSVN 需要打开哪些端口进行身份验证(基本)才能提交?我知道这不是一件好事,但我相信用户名和密码现在是清楚的。 让我尽可能多地描述一下我所知道的设置以及似乎正在发生的情况。 我是一名承
我正在使用速度模板为通知系统生成纯文本电子邮件。我有一个“收件人”POJO 列表,其中包含用户 ID 和电子邮件地址。我想迭代这些 POJO 并在一行中输出用户 ID(最终用逗号等分隔符分隔)。我在格
我正在尝试围绕 CNG 的 AES 实现 AES-OFB 包装器以进行对称加密。 我遇到了一个我无法理解的问题...我创建了一个 AES 算法句柄 (BCRYPT_AES_ALGORITHM) 并导入
dat.gui.js 我尝试使用DAT.GUI.js中的文本输入,当我单击输入框时,如果有默认值,文本输入框应该是清晰的。完成后,会弹出一个确认框(Message Box),告知用户输入的消息。 现在
我正在使用原生脚本的 angular 版本并尝试为我的网络创建登录系统。 下面是我尝试登录网络的代码。 home.component.ts import { LoginService } from
我有一个从 Nib 加载的屏幕外 UITextView 实例,当用户点击“评论”按钮时,它会移动到屏幕框架中。输入使用的任何文本都是不可见的。如果用户旋转设备,文本就会出现。 我试过设置 setNee
我正在尝试使用 pyaes 进行 AES 加密。 我的下面的代码运行完美。 text = 'Hello world !!!!' encrypter = pyaes.AESModeOfOperation
我在 Stack Overflow 中看到了很多答案,解释了我们如何通过监听 keydown 事件并将焦点重定向到位于屏幕外的文本区域来删除文本粘贴的格式。这个解决方案很好,但没有解决使用上下文菜单或
正如标题所说。使用 iPhone SDK,我想使用服务器提供的现有 key 和指数对一些(小)明文进行 RSA 加密以进行身份验证。这肯定是一项简单的任务,需要一个库导入和几行代码?如果没有,为什
我是一名优秀的程序员,十分优秀!