IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Récupérer les erreurs Acegi [Security]


Sujet :

Spring Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut Récupérer les erreurs Acegi
    Bonjour,

    Je débute avec Acegi. J'ai trouvé pas mal de tutoriels, mais la majorité restent à un niveau de base. Aussi voici une question que je me pose : comment récupérer les erreurs d'Acegi par exemple pour les afficher dans la page?

    En effet, la majorité des tutoriels expliquent comment retourner facilement une page d'erreur en cas de mauvais login. Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
                    ...
                    <property name="authenticationFailureUrl">
                            <value>/login.html?error=true</value>
                    </property>
                    ...
    </bean>
    Mais via ce mécanisme, tout ce qu'on sait dire, c'est qu'il y a eu une erreur, mais pas laquelle. Or ce n'est pas toujours à cause d'un mauvais mot de passe que le login est refusé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class UserDetailsServiceImpl implements org.acegisecurity.userdetails.UserDetailsService {
            ...
            public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {     
            ...
                    return new org.acegisecurity.userdetails.User(login, user.getPassword(), user.getEnabled(), !user.getAccountExpired(), !user.getCredentialsExpired(), !user.getLocked(), arrayAuths);
            }
    }
    En effet, maintenant si je veux prévenir mon utilisateur qu'il s'est vu refuser le login parce que son compte a été bloqué, ou n'est pas encore été activé, etc. Comment puis-je m'y prendre?

    Merci pour vos réponses

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Asterius Voir le message
    Bonjour,

    Je débute avec Acegi. J'ai trouvé pas mal de tutoriels, mais la majorité restent à un niveau de base. Aussi voici une question que je me pose : comment récupérer les erreurs d'Acegi par exemple pour les afficher dans la page?


    En effet, maintenant si je veux prévenir mon utilisateur qu'il s'est vu refuser le login parce que son compte a été bloqué, ou n'est pas encore été activé, etc. Comment puis-je m'y prendre?

    Merci pour vos réponses
    une façon de faire :

    vous pouvez ajoutez à votre bean id="authenticationProcessingFilter" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <property name="exceptionMappings">
        <props>
            <prop key="EXCEPTION_CLASS">ERROR_URL</prop>
        </props>
    </property>
    sous-classez AuthenticationProcessingFilter (-> changez la class="YOUR_CLASS" du bean id="authenticationProcessingFilter")
    et override de
    dans lequel vous pouvez faire un raise de vos propres exceptions (à mettre comme EXCEPTION_CLASS dans les exceptionMappings) en fonction de l'erreur rencontrée…

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Ceci ne règle pas vraiment mon problème, parce que, à moins de réécrire la méthode d'authentification d'Acegi, je ne sais quand même pas récupérer l'exception lancée par Acegi. Et mon but n'est pas de me créer des exceptions sur mesure, mais bien d'utiliser les mécanismes par défaut d'Acegi basé sur sa propre implémentationd des utilisateurs (org.acegisecurity.userdetails.User).

    Cependant, suite à votre réponse, en explorant le code source d'Acegi, j'ai trouvé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed)
            throws IOException
        {
            SecurityContextHolder.getContext().setAuthentication(null);
            if(logger.isDebugEnabled())
                logger.debug("Updated SecurityContextHolder to contain null Authentication");
            String failureUrl = determineFailureUrl(request, failed);
            if(logger.isDebugEnabled())
                logger.debug("Authentication request failed: " + failed.toString());
            try
            {
                request.getSession().setAttribute("ACEGI_SECURITY_LAST_EXCEPTION", failed);
            }
            catch(Exception ignored) { }
            onUnsuccessfulAuthentication(request, response, failed);
            rememberMeServices.loginFail(request, response);
            sendRedirect(request, response, failureUrl);
        }
    Il ne me reste plus qu'à savoir comment récupérer cette HttpSession qui contient l'exception et le tour sera joué... Une idée?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Asterius Voir le message
    Ceci ne règle pas vraiment mon problème, parce que, à moins de réécrire la méthode d'authentification d'Acegi, je ne sais quand même pas récupérer l'exception lancée par Acegi. Et mon but n'est pas de me créer des exceptions sur mesure, mais bien d'utiliser les mécanismes par défaut d'Acegi basé sur sa propre implémentationd des utilisateurs (org.acegisecurity.userdetails.User).

    Cependant, suite à votre réponse, en explorant le code source d'Acegi, j'ai trouvé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed)
            throws IOException
        {
            SecurityContextHolder.getContext().setAuthentication(null);
            if(logger.isDebugEnabled())
                logger.debug("Updated SecurityContextHolder to contain null Authentication");
            String failureUrl = determineFailureUrl(request, failed);
            if(logger.isDebugEnabled())
                logger.debug("Authentication request failed: " + failed.toString());
            try
            {
                request.getSession().setAttribute("ACEGI_SECURITY_LAST_EXCEPTION", failed);
            }
            catch(Exception ignored) { }
            onUnsuccessfulAuthentication(request, response, failed);
            rememberMeServices.loginFail(request, response);
            sendRedirect(request, response, failureUrl);
        }
    Il ne me reste plus qu'à savoir comment récupérer cette HttpSession qui contient l'exception et le tour sera joué... Une idée?
    en fait vous ne devez pas obligatoirement créer vos propres exceptions, vous pouvez aussi mappez les exceptions de Acegi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    AuthenticationException
    Direct Known Subclasses:
    AccountExpiredException, AuthenticationCredentialsNotFoundException, AuthenticationServiceException, BadCredentialsException, ConcurrentLoginException, CredentialsExpiredException, DisabledException, InsufficientAuthenticationException, LockedException, NonceExpiredException, ProviderNotFoundException, ProxyUntrustedException, SessionAlreadyUsedException
    dans "exceptionMappings" …

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    J'ai trouvé le moyen de récupérer l'exception d'Acegi dans mon backing bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Exception exception = (Exception)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("ACEGI_SECURITY_LAST_EXCEPTION");

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les erreurs Oracle pendant les insert/update/delete
    Par robinson50 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 05/03/2009, 11h44
  2. comment récupérer les erreur d'exécution cron
    Par Ohemeg dans le forum RedHat / CentOS / Fedora
    Réponses: 9
    Dernier message: 23/12/2008, 01h10
  3. [2.2.2] Détecter et récupérer les erreurs oracle
    Par alexandre_71 dans le forum BIRT
    Réponses: 1
    Dernier message: 10/10/2008, 14h53
  4. Récupérer les erreurs de connexion
    Par guiom dans le forum JPA
    Réponses: 7
    Dernier message: 15/04/2008, 10h13
  5. récupérer les erreurs php dans des exceptions
    Par jeanvincent dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo