Comment authentifier un utilisateur à partir d'une action JSF (ou dans les méthodes de servlet doGet
/doPost
)? je veux dire quelque chose comme:Authentification par programmation Java EE 5
Authenticator auth = ...;
if (!auth.authenticate("user","password"))
{
FacesContext.getInstance().addMessage("Incorrect username or password", null);
}
Restrictions:
- Cette méthode doit être compatible avec la sécurité gérée par conteneur. (c'est-à-dire `HttpServletRequest.getRemoteUser()` doit renvoyer un utilisateur authentifié)
- Cette méthode doit fonctionner partout (c'est-à-dire sur chaque serveur d'application).
Ne pas utiliser j_security_check
ou d'un autre type d'authentification J2EE (BASIC, DIGEST, etc ...)
Il est possible?
Ou comment créer captcha de cette façon?
Validez que login et mot de passe ne sont pas vides?
sur une seule page et sans JavaScript, bien sûr ...
Des questions similaires ... mais sans réponse sur cette question:
JSF authentication and authorization
Performing user authentication in Java EE/JSF using j_security_check
Edit 1:
I Serlvet API moyenne au moins 2,3. Oui, je lis à propos de login
dans Servlet API 3.0, mais il est pris en charge uniquement par les nouvelles versions des serveurs d'applications.
Je pense qu'il peut y avoir une solution qui implémente cette authentification pour chaque serveur d'application. Parfois, via certains hacks, parfois via des classes spéciales conçues à cet effet. Comme ceci:
private Class<?> tryClass(String name)
{
try
{
return Class.forName(name);
}
catch (ClassNotFoundException e)
{
return null;
}
}
public boolean authenticate(String username, String password) throws AuthenticationException
{
try
{
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
Object request = context.getRequest();
Object response = context.getResponse();
Class<?> authClass = tryClass("com.sun.appserv.security.ProgrammaticLogin");
if (authClass != null)
{
return (Boolean)authClass.getMethod("login").invoke(
authClass.newInstance(), "user", "password", request, response);
}
authClass = tryClass("org.jboss.web.tomcat.security.login.WebAuthentication");
if (authClass != null)
{
return (Boolean)authClass.getMethod("login").invoke(
authClass.newInstance(), "user", "password");
}
// ... other hacks ...application servers
}
catch (Exception e)
{
throw new AuthenticationException("an error occured during user authentication", e);
}
return false;
}
Utilisez-vous vraiment le vintage J2EE? Tu ne veux pas dire Java EE? Si oui, 5 ou 6? Java EE 5 ne propose aucune fonctionnalité pour l'authentification par programmation, Java EE 6 do, comme vous pouvez le lire dans la dernière question liée. – BalusC
Je suis désolé. Java EE 5 bien sûr. Toujours les confondre. – ProgramWriter
Vous avez mentionné Servlet 2.3. La servlet 2.3 fait partie de J2EE 1.3. Java EE 5 a Servlet 2.5. – BalusC