Après avoir cherché sur le Web et essayé de nombreuses façons différentes, voici ce que je recommanderais pour l'authentification Java EE 6 :
Configurer le domaine de sécurité :
Dans mon cas, j'avais les utilisateurs dans la base de données. J'ai donc suivi ce billet de blog pour créer un JDBC Realm qui pouvait authentifier les utilisateurs en fonction du nom d'utilisateur et des mots de passe hachés en MD5 dans ma table de base de données :
http://blog.gamatam.com/2009/11/jdbc-realm-setup-with-glassfish-v3.html
Remarque : le billet parle d'une table utilisateur et d'une table de groupe dans la base de données. J'avais une classe Utilisateur avec un attribut enum UserType mappé via des annotations javax.persistence à la base de données. J'ai configuré le domaine avec la même table pour les utilisateurs et les groupes, en utilisant la colonne userType comme colonne de groupe et cela a fonctionné correctement.
Utiliser l'authentification par formulaire :
En suivant toujours le billet de blog ci-dessus, configurez votre web.xml et sun-web.xml, mais au lieu d'utiliser l'authentification BASIC, utilisez FORM (en fait, peu importe lequel vous utilisez, mais j'ai fini par utiliser FORM). Utilisez le standard HTML , pas le JSF .
Ensuite, utilisez le conseil de BalusC ci-dessus sur l'initialisation paresseuse des informations utilisateur à partir de la base de données. Il a suggéré de le faire dans un bean géré en récupérant le principal du contexte faces. J'ai utilisé, au lieu de cela, un bean de session stateful pour stocker les informations de session pour chaque utilisateur, j'ai donc injecté le contexte de session :
@Resource
private SessionContext sessionContext;
Avec le principal, je peux vérifier le nom d'utilisateur et, en utilisant l'EJB Entity Manager, obtenir les informations de l'utilisateur à partir de la base de données et les stocker dans mon EJB SessionInformation
.
Déconnexion :
J'ai également cherché la meilleure façon de se déconnecter. La meilleure que j'ai trouvée est d'utiliser un Servlet :
@WebServlet(name = "LogoutServlet", urlPatterns = {"/logout"})
public class LogoutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
// Détruit la session pour cet utilisateur.
if (session != null)
session.invalidate();
// Redirige vers la page initiale.
response.sendRedirect(request.getContextPath());
}
}
Même si ma réponse est vraiment tardive étant donné la date de la question, j'espère que cela aidera d'autres personnes qui se retrouvent ici depuis Google, tout comme moi.
Ciao,
Vítor Souza