我想知道如何在 WebSphere Liberty 中启用 WS-Security
我已经在我的服务器中创建了一个用户(soa_user)和用户组(soa_group.xml在 Liberty 配置文件中。下面提到的所有功能都已成功安装。
服务器.xml
<server description="new server">
<!-- Enable features -->
<featureManager>
<feature>javaee-7.0</feature>
<feature>jdbc-4.1</feature>
<feature>localConnector-1.0</feature>
<feature>ssl-1.0</feature>
<feature>servlet-3.1</feature>
<feature>wsSecurity-1.1</feature>
<feature>appSecurity-2.0</feature>
<feature>jaxws-2.2</feature>
</featureManager>
<keyStore id="defaultKeyStore" password="yourPassword" />
<basicRegistry id="basic" realm="Authentication">
<user name="soa_user" password="testUserPassword" />
<group name="soa_group">
<member name="soa_user" />
</group>
</basicRegistry>
<httpEndpoint host="*" httpPort="8080" httpsPort="9443" id="defaultHttpEndpoint" />
.....
</server>
我有两个模块,一个用于生成EAR(ABCServiceEAR)文件,另一个是SOAPService(ABCSOAPService)
在 ABCSOAPService 的src\main\web.xml我创建了一个用户角色作为 bellow
<security-role id="security_role_1">
<role-name>authenticated-user</role-name>
</security-role>
在 ABCServiceEAR 中的resources\META-INF\ibm-application-bnd下.xml我已将上述用户角色分配给我在 liberty 服务器中创建的组.xml
<security-role name="authenticated-user">
<group name="soa_group" />
</security-role>
我的目标是检查此用户是否从服务终结点实现类进行身份验证,如下所示
@javax.jws.WebService (endpointInterface="...",
targetNamespace="...",
serviceName="ABCService_1_0", portName="ABCServicePort_1_0",
wsdlLocation="WEB-INF/wsdl/ABCSOAPService.wsdl")
@HandlerChain(file = "/handlers.xml")
@DeclareRoles({ "authenticated-user" })
public class ABCSOAPServiceImpl implements ABCSOAPService {
@Resource
private WebServiceContext wsContext;
public void myMethod() {
if (!wsContext.isUserInRole("authenticated-user")) {
//do something
}
}
我的 SOAP 标头就像下面一样
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-1314D8CB1A76EFB5F614902572284093">
<wsse:Username>soa_user</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">testUserPassword</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">cCdfT/hAg3p4vNwRHP/BMA==</wsse:Nonce>
<wsu:Created>2017-03-23T08:20:28.409Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
我得到的回应是低沉的
<faultcode>soap:MustUnderstand</faultcode>
<faultstring>MustUnderstand headers: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood.</faultstring>
即使我将 soapenv:mustUnderstanding 设置为"0",应用程序也无法识别服务端点类中的用户(wsContext.getUserPrincipal() 为空)。
我是WS Security的新手,
有人可以告诉我如何实现这一点吗?
我应该向我的 WSDL 添加什么?
或者是否有方法可以在不更改 WSDL 的情况下全局配置安全性(可能在 Liberty 配置文件中)
更新
我在 {ProjectLocation}\src\main\webapp\WEB-INF\policy-attachments-server.xml 中提供了 ws-security policy(policy attachment) 作为下面。
<attachments
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://www.w3.org/ns/ws-policy"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:sp13="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200802"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:PolicyAttachment wsdlNamespace="com.my-service.sales.servs.MyService">
<wsp:AppliesTo>
<wsa:EndpointReference>
<wsa:Address>http://localhost:9080/sales/servs/MyService_1_0</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wsp:Policy wsu:Id="UsernameTokenwithPasswordHashoverSSL">
<wsp:ExactlyOne>
<wsp:All>
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
</wsp:PolicyAttachment>
</attachments>
我仍然遇到同样的问题。
您需要在服务中附加 ws-security 策略。您可以在 WSDL 中添加 ws-security 策略,也可以在 web-inf 目录 (http://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.wlp.zseries.doc/ae/twlp_dep_policyattach.html) 中创建策略附件文件。
我们有适用于你的方案的策略示例和配置选项,请参阅 https://www.ibm.com/support/knowledgecenter/SSEQTP_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/cwlp_wssec_utoken.html。您可以使用此链接中的策略,并跳到"在 Web 服务提供商中使用用户名令牌"以获取说明。
在 policy-attachments-server.xml 中使用 wsp:URI,而不是 wsa:EndpointReference