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 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".
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
- Fügen Sie die erforderlichen Sicherheitsmethoden zum Servlet-Code hinzu.
- 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
Beispiel
<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>
<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>
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
....
}
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
....
}
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
....
}
@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);
}
}
<security-role-ref>
<description> </description>
<role-name>Mgr</role-name>
</security-role-ref>