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>
Siehe diesen Artikel - Tomcat muss SSL- oder https-Verbindung unterstützen
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.
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
Download - JAX-WS-Container-Authentication-Example.zip (11 KB)
Referenz
-
http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html [Tomcat-Bereich
WIE MAN]. http://docs.sun.com/app/docs/doc/819-3669/bnccv?a=view [Example: Basic
Authentifizierung mit JAX-WS]. http://www.ryandelaplante.com/2007/06/ssl-and-http-basic-authentication-with.html [SSL
und HTTP-BASIC-Authentifizierung mit Glassfish und JAX-WS]