使用JAX-WS的容器身份验证–(Tomcat版本)

在本文中,我们向您展示如何在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

jaxws-container-authentication--example

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)

参考

  1. Tomcat领域如何
  2. 示例:使用JAX-WS的基本身份验证
  3. 使用Glassfish和JAX-WS进行SSL和HTTP BASIC身份验证

翻译自: https://mkyong.com/webservices/jax-ws/container-authentication-with-jax-ws-tomcat/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值