Forum Ametys

Forum de la communauté Ametys

You are not logged in.

#1 06/03/2014 11:43:38

gafou
Guest
Registered: 18/02/2014
Posts: 9

Authentification front globale

Bonjour,

J'ai besoin pour mon site de permettre à l'utilisateur de s'authentifier sur le front.
J'ai donc fait des premier tests avec le système de gestion des utilisateurs front existant : login/inscription/gestion des données utilisateur ()

Hors, je n'ai pas vu de possibilité d'afficher le login - mode "Vous avez déjà un compte"- hors des pages a accés limité.

J'ai mis mon service sign-up dans l'en-tête de mes pages mais il n'apparait qu'on mode "Inscription".


Y a-t-il un moyen simple de mettre en place une authentification utilisateur front globale et non pas aux pages d'accès restreint ?

Last edited by gafou (06/03/2014 11:44:19)

Offline

#2 06/03/2014 12:53:39

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,117

Re: Authentification front globale

Si j'ai bien compris vous souhaitez avoir un formulaire de login sur toute vos pages ? (et pas uniquement qui s'affiche quand on clique sur une page à accès restreint).

Alors déjà, vos pages finales ne seront plus cacheables (puisque une fois loggué vous ne souhaitez plus afficher ce formulaire, mais plutot le login de la personne). Lorsque vous affectez cette charte à un site, il faut donc impérativement décocher "Afficher les pages à accès limité" dans la configuration du site.
Ainsi, actuellement tout le monde voit un plan du site complet, mais suite à cette modification de paramètre, chacun ne verra que les pages auquel il a droit => si on est pas loggué on ne voit aucune page limité => on ne peut plus tomber sur le page de login en navigant => il faut ajouter la possibilité de se logguer dans la charte.

Ensuite, simplement dans votre charte:
* Soit l'utilisateur est loggué et vous affichez son nom via
* Soit il n'est pas loggué et vous affichez un mini-formulaire sur le modèle de celui de la page de login en POST avec "Username", "Password" et un champ caché "requestedURL" à l'adresse "_authenticate". (requestedURL est à remplir avec le path de la page en cours que vous récupérez de la façon suivante (à tester car je code à l'aveugle là) resolver:resolveURI('page', ametys:pageId())

J'espère avoir répondu à la question smile


Raphael Franchet
Expert Ametys

Offline

#3 06/03/2014 15:05:33

gafou
Guest
Registered: 18/02/2014
Posts: 9

Re: Authentification front globale

Bonjour,

Merci pour cette réponse.

Il me reste le problème du retrour en erreur du formulaire. En effet, en cas d'erreur sur la connexion, le retour va obligatoirement sur le xsl de login (skin/maskin/services/web/pages/frontoffice-login/login.xsl) qui remplace le contenu de la page par le login.

Y a-t-il un moyen de le faire renvoyer sur le xsl de la page courante, avec la gestion des erreurs au niveau du  formulaire custom ?

Last edited by gafou (06/03/2014 15:05:46)

Offline

#4 06/03/2014 15:25:16

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,117

Re: Authentification front globale

En effet, car vous utilisez l'authentification par défaut.
Ce qu'il faut faire dans votre cas :
1) déclarer une nouvelle authentification en dupliquant celle par défaut dans votre plugin.xml
2) la faire pointer vers votre propre classe java qui hérite de celle par défaut
3) surcharger la méthode getLoginFailedURL pour renvoyer le contenu du paramètre
4) choisir cette nouvelle authentification dans le runtime.xml

Mais attention, tout ça est à faire dans l'application site (et pas l'application backoffice) : il est probable que vous n'y ayez pas encore de plugin.
Voici le plugin site par défaut :  Vous y trouverez ceci :

    <feature name="site.authentication.impl.formbased">
        <!-- 
            This features defines the form based credential provider for front office. Data are sent to the provider through a
            html form. If the option is enabled, user's data can be stored with a cookie.
         -->
        <extensions>
            <extension point="org.ametys.runtime.authentication.CredentialsProvider"
                       id="org.ametys.site.plugins.site.authentication.FormBased"
                       class="org.ametys.plugins.site.authentication.SiteFormBasedCredentialsProvider"
                       logger="org.ametys.runtime.authentication.formbased">
                <username-field>Username</username-field>
                <password-field>Password</password-field>
                <rememberMe-field>rememberMe</rememberMe-field>
                <cookie>
                    <cookieEnabled>true</cookieEnabled>
                    <cookieLifeTime>604800</cookieLifeTime>
                    <cookieName>AmetysSiteAuthentication</cookieName>
                </cookie>
                <loginUrl internal="true"/>
                <loginFailedUrl provideLoginParameter="true" internal="true"/>
            </extension>
        </extensions>
    </feature>

L'url d'erreur par défaut de la classe est la suivante :

    @Override
    protected String getLoginFailedURL()
    {
        return "_generate/plugins/web/frontoffice-formbasedauthentication/login/failed/" + getSite();
    }

"_generate" signifie de faire suivre au backoffice
dans votre cas ça devra ressembler à ceci (codé à l'aveugle encore smile):

    @Override
    protected String getLoginFailedURL()
    {
        return "_generate/" + getSite() + ContextHelper.getRequest(_context).getParameterValues("requestedURL");
    }

Je vous laisse ensuite ajouter un éventuel "?loginfailed=true" à la fin pour dans votre xsl traiter ce cas via un


Raphael Franchet
Expert Ametys

Offline

#5 07/03/2014 16:22:47

gafou
Guest
Registered: 18/02/2014
Posts: 9

Re: Authentification front globale

Pour une raison que je ne m'explique pas, ma redirection vers la page courante repasse quand même par _authenticate, et ce même après changement de mon url getLoginFailedURL ("_generate/" + getSite() + ContextHelper.getRequest(_context).getParameter("requestedURL")+"?loginfailed=true").

Url login failed :
_generate/monsite/fr/index.html?loginfailed=true
Logs :

2014-03-07 15:05:22,369 INFO  [sitemap] Redirecting to 'cocoon://_generate/monsite/fr/index.html?loginfailed=true&login=456456'
2014-03-07 15:05:22,482 INFO  [access] '_authenticate' Processed by Apache Cocoon 2.1.11 in 116 milliseconds.

URL de la page affichée en retour erreur : 
http://localhost:8080/_authenticate?requestedURL=/fr/index.html

J'ai l'impression que c'est l'ajout du paramètre "login=456456" qui déclenche la redirection sur _authenticate.
De quoi celà peut-il venir ? Y aurait-il un autre élément à surcharger ?

Last edited by gafou (07/03/2014 16:25:06)

Offline

#6 07/03/2014 16:37:27

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,117

Re: Authentification front globale

Au moment où vous cliquez dans "se logguer" pour soumettre le formulaire vous envoyez à l'url "_authenticate" c'est ça ?
Si ça fonctionne, vous être redirigé correctement.
Si ça rate, à la place de votre page courante avec une petite erreur dans le formulaire, vous avez une grosse page d'erreur ?


Raphael Franchet
Expert Ametys

Offline

#7 07/03/2014 16:51:15

Raphaël Franchet
Expert Team
From: Toulouse
Registered: 10/08/2010
Posts: 1,117

Re: Authentification front globale

Vous avez "http://localhost:8080/_authenticate?requestedURL=/fr/index.html" dans l'url car c'est l'url à laquelle vous avez soumis le formulaire. La redirection vers votre page n'est qu'interne.... c'est pas top.

Pour faire une redirection externe, dans la configuration du plugin, il faut mettre <loginFailedUrl provideLoginParameter="true" internal="false"/>

Par contre, en faisant, ce que je vous ai dit plus haut, vous êtes en train de créer une belle faille de sécurité smile
En effet, la page de "login failed" est toujours acceptée et servie ; et là la page courante est la page de login failed => toutes les pages doivent être acceptée !!! un comble smile => à tester en tapant manuellement l'url d'une page protégée.


Pour répondre à votre interrogation, en effet si vous regardez le code dans le SVN, vous verrez que la méthod "accept" se conduit différemment à partir du moment où le login est en paramètre de n'importe quelle url.
Vous pouvez essayer déjà en mettant à false "provideLoginParameter" dans la configuration du plugin.
La méthode "accept" sert à indiquer que la page n'a pas besoin d'authentification.


Raphael Franchet
Expert Ametys

Offline

Board footer

Powered by FluxBB