Développement à l'aide des API de sécurité par programmation pour les applications Web
Ces informations permettent de sécuriser par programmation les API pour les applications Web.
Avant de commencer
La sécurité par programmation est utilisée par les applications sensibles à la sécurité lorsque la sécurité déclarative seule ne suffit pas à définir le modèle de sécurité de l'application.
Les API logout, login et authenticate sont nouvelles pour Java™ Servlet 3.0 dans cette édition de WebSphere Application Server.
Vous pouvez configurer plusieurs options d'authentification Web qui déterminent la façon dont le client Web interagit avec les URI (Uniform Resource Identifiers) protégés et non protégés. Vous pouvez également indiquer si WebSphere Application Server demande au client Web de fournir des informations d'authentification de base si l'authentification de certificat pour le client HTTPS échoue. Pour plus d'informations, lisez l'article relatif à la sélection d'un mécanisme d'authentification.
Vous pouvez activer un module de connexion de manière à indiquer la classe principale renvoyée par ces appels. Pour plu d'informations, voir la rubrique relative au mappage d'un principal de registre à un ID utilisateur de System Authorization Facility à l'aide du module de connexion de Java Authentication and Authorization Services.
Si vous utilisez la méthode isUserInRole, déclarez un élément security-role-ref dans le descripteur de déploiement avec un sous-élément role-name contenant le nom du rôle transmis à cette méthode ou utilisez l'annotation @DeclareRoles. Les rôles réels étant créés au cours de la phase d'assemblage de l'application, vous pouvez utiliser un rôle logique en tant que nom du rôle et fournir suffisamment de conseils à l'assembleur dans la description de l'élément security-role-ref pour lier ce rôle au rôle réel. Au cours de l'assemblage, l'assembleur crée un sous-élément role-link pour lier le nom du rôle au rôle réel. La création d'un élément security-role-ref est possible si un outil d'assemblage tel que Rational Application Developer est utilisé. Vous pouvez également créer l'élément security-role-ref lors de la phase d'assemblage à l'aide d'un outil d'assemblage.
Procédure
- Ajoutez les méthodes de sécurité requises dans le code du servlet.
- Créez un élément security-role-ref à l'aide de la zone role-name. Si aucun élément security-role-ref n'est créé au cours du développement, vérifiez s'il est créé au cours de la phase d'assemblage.
Résultats
Exemple
<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) {
....
// to logoff the current user
request.logout();
// to login with a new user
request.login(“bob”,”bobpwd”)
// to get remote user using getUserPrincipal()
java.security.Principal principal = request.getUserPrincipal();
String remoteUser = principal.getName();
// to get remote user using getRemoteUser()
remoteUser = request.getRemoteUser();
// to check if remote user is granted Mgr role
boolean isMgr = request.isUserInRole("Mgr");
// use this information in any way as needed by
// the application
....
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// to logout the current user. If you are not already authenticate, then no need to call the logout() method.
request.logout();
// to login with a new user
request.login(“utle”,”mypwd”)
// the user utle subject now set on the thread and the LTPA SSO cookie is set in the response
....
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// to logout the current user. If you are not already authenticate, then no need to call the logout() method.
// to login with a new user
request.authenticate(response);
// the new user subject now set on the thread and the LTPA SSO cookie is set in the response
....
}
@javax.annotation.security.DeclareRoles("Mgr")
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
....
// to get remote user using getUserPrincipal()
java.security.Principal principal = request.getUserPrincipal();
String remoteUser = principal.getName();
// to get remote user using getRemoteUser()
remoteUser = request.getRemoteUser();
// to check if remote user is granted Mgr role
boolean isMgr = request.isUserInRole("Mgr");
// use this information in any way as needed by
// the application
....
}
L'exemple suivant décrit une application Web ou un servlet utilisant le modèle de sécurité par programmation.
Cet exemple de modèle de sécurité par programmation n'est qu'un exemple parmi d'autres. L'application peut utiliser les informations renvoyées par les méthodes getUserPrincipal, isUserInRole et getRemoteUser de toute autre manière qui lui soit significative. Utilisez le modèle de sécurité déclarative lorsque cela est possible.
Fichier : 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";
// get remote user using getUserPrincipal()
java.security.Principal principal = request.getUserPrincipal();
String remoteUserName = "";
if( principal != null )
remoteUserName = principal.getName();
// get remote user using getRemoteUser()
String remoteUser = request.getRemoteUser();
// check if remote user is granted Mgr role
boolean isMgr = request.isUserInRole("Mgr");
// display Hello username for managers and bob.
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();
// displays "Hello" for ordinary users
// and displays "Hello username" for managers and "bob".
response.getOutputStream().write(bytes);
}
}
<security-role-ref>
<description> </description>
<role-name>Mgr</role-name>
</security-role-ref>