Container-Authentifizierung mit JAX-WS - (Tomcat-Version)

In diesem Artikel zeigen wir Ihnen, wie Sie die Container-Authentifizierung mit JAX-WS unter Tomcat 6.0 implementieren. Auf diese Weise ist die Authentifizierung eher deklarativ als programmatisch: Anwendungsauthentifizierung in JAX-WS . Und Tomcat implementiert die Container-Authentifizierung über security realm .

Am Ende dieses Artikels authentifiziert der bereitgestellte Web-Service den Benutzer anhand der Authentifizierungsdaten, die in der Tomcat-Datei conf/tomcat-users.xml gespeichert sind.

1. WebService

Erstellen Sie einen einfachen JAX-WS-RPC-Stil.

Datei: 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();

}

Datei: UserProfile Impl.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

Konfigurieren Sie eine Sicherheitsrolle "Operator", machen Sie für die URL "/user" die grundlegende HTTP-Authentifizierung erforderlich. Siehe "web.xml" -Datei, selbsterklärend.

Datei: 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>
<user-data-constraint>
    <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

3. Tomcat-Benutzer

Fügen Sie eine neue Rolle, einen Benutzernamen und ein neues Passwort in die Datei "$ Tomcat/conf/tomcat-users.xml" hinzu. Fügen Sie in diesem Fall den neuen Benutzer "mkyong", 123456 '' hinzu und fügen Sie ihn einer Rolle namens "operator" hinzu.

Datei: $ 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 Realm

Konfigurieren Sie den Sicherheitsbereich in der Datei "$ Tomcat/conf/server.xml". In diesem Fall werden die Authentifizierungsinformationen in $ Tomcat/conf/tomcat-users.xml mit dem Standard` UserDatabaseRealm` gelesen.

Datei: $ 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. Stellen Sie den JAX-WS-Webdienst auf Tomcat bereit

Dieses ausführliche Handbuch finden Sie unter Bereitstellen der JAX-WS-Webdienste auf Tomcat .

6. Testen

Für den Zugriff auf den bereitgestellten Webdienst ist nun eine Authentifizierung mit Benutzername und Kennwort erforderlich.

jaxws-container-authentication - Beispiel

7. WebService Client

Um auf den bereitgestellten Webdienst zuzugreifen, binden Sie einen korrekten Benutzernamen und ein Kennwort wie folgt:

    UserProfile port = service.getPort(UserProfile.class);
    BindingProvider bp = (BindingProvider) port;
    bp.getRequestContext().put(BindingProvider.USERNAME__PROPERTY, "mkyong");
    bp.getRequestContext().put(BindingProvider.PASSWORD__PROPERTY, "123456");

Datei: 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());

    }

}

Ausgabe

getUserName() : returned value
  • Hinweis ** + Für diese Clients, die einen ungültigen Benutzernamen oder ein ungültiges Kennwort angegeben haben, gibt Tomcat die folgende Ausnahme zurück:

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException:
    request requires HTTP authentication: Unauthorized

Erledigt.

Quellcode herunterladen