Entwicklung mit programmgesteuerten Sicherheits-APIs für Webanwendungen

Verwenden Sie diese Informationen, um APIs für Webanwendungen über das Programm zu schützen.

Vorbereitende Schritte

Die programmgesteuerte Sicherheit wird von Anwendungen verwendet, die Sicherheitskomponenten unterstützen, wenn die deklarative Sicherheit allein nicht ausreichend ist, um das Sicherheitsmodell der Anwendung zu definieren.

Die Servletsicherheitsmethoden "authenticate", "login", "logout", "getRemoteUser", "isUserInRole" und "getAuthType" sind Methoden der Schnittstelle "javax.servlet.http.HttpServletRequest". Ausführlichere Informationen zu diesen Servletsicherheitsmethoden finden Sie im Artikel zu den Sicherheitsmethoden für Servlets.
Anmerkung:

Die APIs für die Abmeldung, Anmeldung und Authentifizierung sind für Java™ Servlet 3.0 in diesem Release von WebSphere Application Server neu.

Sie können verschiedene Optionen für die Webauthentifizierung konfigurieren, die bestimmen, wie der Web-Client mit geschützten und ungeschützten URIs (Uniform Resource Identifiers) interagiert. Außerdem können Sie angeben, ob WebSphere Application Server die Daten für die Basisauthentifizierung vom Web-Client anfordern soll, wenn die Zertifikatsauthentifizierung für den HTTPS-Client fehlschlägt. Weitere Informationen finden Sie im Artikel "Authentifizierungsmechanismus auswählen".

[z/OS]Sie können ein Anmeldemodul so einrichten, das es die von diesen Aufrufen zurückgegebene Principalklasse anzeigt. Weitere Informationen finden Sie im Artikel über die Zuordnung eines Registry-Principals zu einer SAF-Benutzer-ID (System Authorization Facility) über ein JAAS-Anmeldemodul (Java Authentication and Authorization Service).

Bei Verwendung der Methode isUserInRole sollte im Implementierungsdeskriptor ein Element security-role-ref deklariert werden, das ein untergeordnetes Element role-name mit dem an diese Methode übergebenen Rollennamen enthält. Sie können auch die Annotation @DeclareRoles verwenden. Da tatsächliche Rollen beim Assemblieren der Anwendung erstellt werden, können Sie den Namen einer logischen Rolle verwenden und den Assemblierenden in der Beschreibung des Elements security-role-ref darauf hinweisen, dass diese Rolle über einen Link mit der tatsächlichen Rolle verbunden werden soll. Während der Assemblierung erstellt der Assemblierende ein untergeordnetes Element role-link, um den Namen der Rolle mit der tatsächlichen Rolle zu verknüpfen. Die Erstellung eines Elements "security-role-ref" ist möglich, wenn ein Assembliertool wie Rational Application Developer verwendet wird. Sie können das Element "security-role-ref" auch beim Assemblieren mit einem Assembliertool erstellen.

Vorgehensweise

  1. Fügen Sie die erforderlichen Sicherheitsmethoden zum Servlet-Code hinzu.
  2. Erstellen Sie ein Element security-role-ref mit dem Feld role-name. Wenn während der Entwicklung kein Element security-role-ref erstellt wird, vergewissern Sie sich, dass dieser Schritt bei der Assemblierung ausgeführt wird.

Ergebnisse

Eine Servletanwendung mit programmgesteuertem Schutz.

Beispiel

Diese Schritte sind für die programmgesteuerte Sicherung einer Anwendung notwendig. Sinnvoll ist dies beispielsweise bei einer Webanwendung, die auf externe Ressourcen zugreift und mit ihrer eigenen Berechtigungstabelle den Zugriff auf externe Ressourcen steuern möchte (Zuordnung externer Ressourcen zu externen Benutzern). In diesem Fall kann mit den Methoden getUserPrincipal oder getRemoteUser der ferne Benutzer abgefragt werden. Anschließend kann die Anwendung für die Berechtigung ihre eigene Berechtigungstabelle konsultieren. Mit der Information zum fernen Benutzer können auch die entsprechenden Benutzerdaten aus einer externen Quelle, z. B. aus einer Datenbank oder Enterprise Bean, angefordert werden. Die Methode isUserInRole können Sie auf ähnliche Weise verwenden.
Nach der Entwicklung können Sie ein Element security-role-ref erstellen:
<security-role-ref>
   <description>Provide hints to assembler for linking this role 
                name to an actual role here<\description>
   <role-name>Mgr<\role-name>
</security-role-ref>
Während der Assemblierung erstellt der Assemblierende wie folgt ein Element role-link:
<security-role-ref>
   <description>Hints provided by developer to map the role 
                name to the role-link</description>
   <role-name>Mgr</role-name>
   <role-link>Manager</role-link>
</security-role-ref>
In jede der Servicemethoden doGet, doPost, doPut, doDelete eines Servlet können programmgesteuerte Servletsicherheitsmethoden aufgenommen werden. Das folgende Beispiel zeigt die Verwendung einer API für programmgesteuerte Sicherheit:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // Anmeldung des aktuellen Benutzers
	 request.logout();
    
   // Anmeldung eines neuen Benutzers
   request.login(“bob”,”bobpwd”)

   // Abfragen des fernen Benutzers mit getUserPrincipal()
   java.security.Principal principal = request.getUserPrincipal();
   String remoteUser = principal.getName();
 
   // Abfragen des fernen Benutzers mit getRemoteUser()
   remoteUser = request.getRemoteUser();

   // Prüfen, ob der Benutzer für die Rolle Mgr berechtigt ist
   boolean isMgr = request.isUserInRole("Mgr");

   // Die obigen Informationen können von der Anwendung
   // bei Bedarf genutzt werden
   ....
                  
}
Sie können mit einer Benutzer-ID und einem Kennwort in jeder Servletmethode des Typs doGet, doPost, doPut und doDelete eine programmgesteuerte Anmeldung durchführen. Das folgende Beispiel veranschaulicht die Verwendung einer programmgesteuerten API für Anmeldung/Abmeldung:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // Abmeldung des aktuellen Benutzers. Wenn Sie noch nicht authentifiziert sind, müssen Sie die Methode logout() aufrufen.
   request.logout();
    
   // Anmeldung eines neuen Benutzers
   request.login(“utle”,”mypwd”)

   // Das Benutzersubjekt wird jetzt im Thread gesetzt, und das
   // LTPA-SSO-Cookie wird in der Antwort gesetzt
   ....
                  
}
Sie können mit einer anderen Identität in jeder Servletmethode des Typs doGet, doPost, doPut und doDelete eine programmgesteuerte Authentifizierung durchführen. Wenn das Web-Servlet in diesem Beispiel für die Verwendung der Basisauthentifizierung (basicAuth) konfiguriert ist, gibt der Web-Server den Antwortcode 401 zurück. Es wird ein Anmeldedialog angzeigt, in dem Sie die Benutzer-ID und das Kennwort für die Authentifizierung eingeben können. Das folgende Beispiel veranschaulicht die Verwendung einer programmgesteuerten API für Anmeldung/Abmeldung:
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....
   // Abmeldung des aktuellen Benutzers. Wenn Sie noch nicht authentifiziert sind, müssen Sie die Methode logout() aufrufen.
    
   // Anmeldung eines neuen Benutzers
   request.authenticate(response);

   // Das neue Benutzersubjekt wird jetzt im Thread gesetzt, und das
   // LTPA-SSO-Cookie wird in der Antwort gesetzt
   ....
                  
}
Wenn Sie Module der Servlet Version 3.0 entwickeln, muss der Wert des Arguments "rolename" in der Methode "isCallerInRole" nicht durch das Deklarieren von security-role-ref-Elementen im Implementierungsdeskriptor definiert werden. Sie können stattdessen Java-Annotationen verwenden.
@javax.annotation.security.DeclareRoles("Mgr")
public void doGet(HttpServletRequest request, 
HttpServletResponse response) {

   ....

   // Abfragen des fernen Benutzers mit getUserPrincipal()
   java.security.Principal principal = request.getUserPrincipal();
   String remoteUser = principal.getName();
 
   // Abfragen des fernen Benutzers mit getRemoteUser()
   remoteUser = request.getRemoteUser();

   // Prüfen, ob der Benutzer für die Rolle Mgr berechtigt ist
   boolean isMgr = request.isUserInRole("Mgr");

   // Die obigen Informationen können von der Anwendung
   // bei Bedarf genutzt werden
   ....
                  
}

Das folgende Beispiel zeigt eine Webanwendung oder ein Servlet, die bzw. das das programmgesteuerte Sicherheitsmodell verwendet.

Es zeigt nur eine der verschiedenen Möglichkeiten, dieses Modell einzusetzen. Die Anwendung kann die Informationen, die von den Methoden getUserPrincipal, isUserInRole und getRemoteUser zurückgegeben werden, auf jede für die Anwendung geeignete Weise nutzen. Verwenden Sie, sofern möglich, das deklarative Sicherheitsmodell.

File : HelloServlet.java

public class HelloServlet extends javax.servlet.http.HttpServlet {

		public void doPost(
				javax.servlet.http.HttpServletRequest request,
				javax.servlet.http.HttpServletResponse response)
				throws javax.servlet.ServletException, java.io.IOException {
	}
public void doGet(
				javax.servlet.http.HttpServletRequest request,
				javax.servlet.http.HttpServletResponse response)
				throws javax.servlet.ServletException, java.io.IOException {
			
        String s = "Hello";
  	
        	
        // Fernen Benutzer mit getUserPrincipal() abrufen.
        java.security.Principal principal = request.getUserPrincipal();
        String remoteUserName = "";
        if( principal != null )
         		remoteUserName = principal.getName();
// Fernen Benutzer mit getRemoteUser() abrufen.
        String remoteUser = request.getRemoteUser();

        // Prüfen, ob ferner Benutzer der Rolle Mgr zugeteilt ist.
        boolean isMgr = request.isUserInRole("Mgr");

        // Hello Benutzername für Manager und bob anzeigen. 
        if ( isMgr || remoteUserName.equals("bob") )
            s = "Hello " + remoteUserName;

		 		 String message =  "<html> \n" +
            				"<head><title>Hello Servlet</title></head>\n" +
      						"<body> /n +"
								"<h1> "  +s+ </h1>/n " + 
				byte[] bytes = message.getBytes();
		
				// "Hello" für "normale" Benutzer 
        // und "Hello Benutzername" für Manager und "bob" anzeigen.
        response.getOutputStream().write(bytes);
	}

}
Nachdem Sie das servlet entwickelt haben, können Sie wie folgt für das HelloServlet eine Sicherheitsrollenreferenz erstellen:
<security-role-ref>
     <description> </description>
     <role-name>Mgr</role-name>
</security-role-ref>

Nächste Schritte

Nachdem Sie eine Anwendung entwickelt haben, können Sie mit einem Assembliertool Rollen erstellen und diese dann mit Rollennamen in den security-role-ref-Elementen zuordnen. Lesen Sie die Informationen zum Sichern von Webanwendungen mit einem Assembliertool.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_web
Dateiname:tsec_web.html