在本文中,我们向您展示如何在Tomcat 6.0下使用JAX-WS实现容器身份验证 。 这样,身份验证就是声明性的,而不是像这样的程序化 – JAX-WS中的应用程序身份验证 。 Tomcat通过安全领域实现容器身份验证。
在本文结尾,部署的Web服务将基于存储在Tomcat的conf/tomcat-users.xml
文件中的身份验证数据对用户进行身份验证。
1. Web服务
创建一个简单的JAX-WS,RPC样式。
文件:UserProfile.java
package com.mkyong.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface UserProfile{
@WebMethod
String getUserName();
}
文件:UserProfileImpl.java
package com.mkyong.ws;
import javax.jws.WebService;
//Service Implementation Bean
@WebService(endpointInterface = "com.mkyong.ws.UserProfile")
public class UserProfileImpl implements UserProfile{
@Override
public String getUserName() {
return "getUserName() : returned value";
}
}
2. web.xml
配置安全角色“操作员”,使URL“ /用户”需要基本的HTTP身份验证。 参见下面的web.xml
文件,不言自明。
档案:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems,
Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
//...
<security-role>
<description>Normal operator user</description>
<role-name>operator</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>Operator Roles Security</web-resource-name>
<url-pattern>/user</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>operator</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<servlet-mapping>
<servlet-name>user</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
//...
</web-app>
注意
在生产中,建议将传输保证设置为“ CONFIDENTIAL ”,以便通过常规http请求(例如http:// localhost:8080 / ws / user)对资源的任何访问都会将Tomcat重定向到https请求https: // localhost:8443 / ws / user 。 当然,可以在Tomcat的conf/server.xml
配置重定向https。<user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint>
请参阅本文– 使Tomcat支持SSL或https连接
3. Tomcat用户
在$Tomcat/conf/tomcat-users.xml
文件中添加新角色,用户名和密码。 在这种情况下,添加新用户“ mkyong”,“ 123456”并将其附加到名为“ operator”的角色。
文件:$ Tomcat / conf / tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="operator"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="mkyong" password="123456" roles="operator"/>
<user name="admin" password="admin" roles="admin,manager" />
</tomcat-users>
4. Tomcat领域
在$Tomcat/conf/server.xml
文件中配置安全领域。 在这种情况下,请使用默认的UserDatabaseRealm
来读取$Tomcat/conf/tomcat-users.xml
的身份验证信息。
文件:$ Tomcat / conf / server.xml
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
5.在Tomcat上部署JAX-WS Web服务
请参阅此详细指南,以了解如何在Tomcat上部署JAX-WS Web服务 。
6.测试
现在,对已部署的Web服务的任何访问都需要用户名和密码身份验证,请参见图:
网址:http:// localhost:8080 / WebServiceExample / user
7. WebService客户端
要访问已部署的Web服务,请绑定正确的用户名和密码,如下所示:
UserProfile port = service.getPort(UserProfile.class);
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "mkyong");
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "123456");
文件:WsClient.java
package com.mkyong.client;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import com.mkyong.ws.UserProfile;
public class WsClient{
//can't parse wsdl "http://localhost:8080/WebServiceExample/user.wsdl" directly
//save it as local file, and parse it
private static final String WS_URL = "file:c://user.wsdl";
public static void main(String[] args) throws Exception {
URL url = new URL(WS_URL);
QName qname = new QName("http://ws.mkyong.com/", "UserProfileImplService");
Service service = Service.create(url, qname);
UserProfile port = service.getPort(UserProfile.class);
//add username and password for container authentication
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "mkyong");
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "123456");
System.out.println(port.getUserName());
}
}
输出
getUserName() : returned value
注意
对于那些提供了无效用户名或密码的客户端,Tomcat将返回以下异常:Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: request requires HTTP authentication: Unauthorized
做完了
下载源代码
下载它– JAX-WS-Container-Authentication-Example.zip (11KB)
参考
翻译自: https://mkyong.com/webservices/jax-ws/container-authentication-with-jax-ws-tomcat/