Création plugin d'authentification automatique Joomla 4

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Création plugin d'authentification automatique Joomla 4

    Bonjour,

    Nous avons créé un plugin pour permettre une authentification automatique pour éviter de passer par le formulaire de connexion. Les utilisateurs existent déjà en base avec les habilitations nécessaires. Le plugin est activé mais jamais appelé même en ayant rajouté dans l'index.php les instructions suivantes :
    // Appel de l'authentification
    use Joomla\Event\Dispatcher as EventDispatcher;
    $dispatcher = new EventDispatcher();
    $defs = $dispatcher->triggerEvent('onAuthenticate',$nom[0]);

    ​Nous sommes très très novices comme l'indique le pseudo, une petite aide serait la bienvenue.

    Merci !

  • #2
    Je ne vois pas très bien ce que "authentification automatique" veut dire.
    Ou bien tout est public et on ne doit même pas se connecter.
    Ou bien un contenu n'est pas public et on doit se connecter.

    L'idée est-elle p ex de déduire le compte de l'utilisateur sur base de son IP ?
    Ou autre chose ?
    Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

    Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

    Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

    Commentaire


    • #3
      Petite précision.
      Les utilisateurs de notre intranet ont des profils "enregistré" leur permettant d'avoir accès à 10 rubriques. Dans ces rubriques il y a d'autres utilisateurs qui ont des profils leur permettant de rajouter des articles ou de voir d'autres rubriques. Les personnes non habilités ont un profil "public" et de ce fait ne voient qu'une seule rubrique. L'affectation dans ces groupes est transparente pour les utilisateurs, dès qu'ils lancent l'URL de l'intranet ils sont authentifiés par le REMOTE_USER et ensuite doivent être "dispatchés" dans les groupes définis dans Joomla. C'est cette dernière action que nous essayons de mettre en oeuvre. Nous l'avons mise en place dans la version Joomla 3.xx grâce à l'extension "shmanic" mais celle-ci n'est plus supportée en Joomla 4. Remplacée par MiniOrange qui ne donne pas le résultat escompté. La solution reste d'écrire notre propre plugin.

      Commentaire


      • #4
        ha ok, c'est un intranet.

        J'ai jamais dû jouer avec un intranet, mais sur un projet similaire où je suis déjà intervenu ils utilisent le plugin LDAP pour auto-connecter les utilisateurs en fonction de leur connexion à leur ordinateur
        Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

        Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

        Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

        Commentaire


        • #5
          Envoyé par NoviceXX Voir le message
          Bonjour,

          Nous avons créé un plugin pour permettre une authentification automatique pour éviter de passer par le formulaire de connexion. Les utilisateurs existent déjà en base avec les habilitations nécessaires. Le plugin est activé mais jamais appelé même en ayant rajouté dans l'index.php les instructions suivantes :
          // Appel de l'authentification
          use Joomla\Event\Dispatcher as EventDispatcher;
          $dispatcher = new EventDispatcher();
          $defs = $dispatcher->triggerEvent('onAuthenticate',$nom[0]);

          ​Nous sommes très très novices comme l'indique le pseudo, une petite aide serait la bienvenue.

          Merci !
          Hello.

          L'approche n'est pas bonne.

          Avec cet appel, vous lancez l'appel à tous les plugins du groupe ? (que vous n'avez pas défini) et à la fonction onAuthenticate de tous les plugins actifs du groupe en question.
          Voir https://docs.joomla.org/J4.x:Trigger...your_extension

          Dans votre cas, tu veux exécuter un plugin à un moment donnée, et pas lancer des fonctions de plugins lors d'un évènement particulier.
          Vu que l'évènement sera l'accès à Joomla sur l'intranet, il ne peut provenir que du framework de Joomla.

          Il faut donc, si joomla ne connait pas encore l'utilisateur, aller voir sur le poste de l'internaute si l'utilisateur est connu, ou appeler une API (je n'ai pas vraiment compris comment vous allez faire le contrôle sans demander le username et le password).

          L'evenement onUserAuthenticate des plugins du groupe authentication actifs est lancé (dans l'ordre de tri des plugins en question) :
          • soit après saisie du user et mdp par l'internaute, afin faire le contrôle du login selon la méthode choisie.
          • soit directement par appel à la methode SiteApplication->login(... qui appelle CMSApplication->login(....
            (voir /libraisies/src/Application/SiteApplication.php ligne 668 et /libraisies/src/Application/CMSApplication.php ligne 818)

          Ce n'est donc pas le bon dans ton cas, car il arrive après la saisie du user et mot de passe, et avant tout contrôle de la validité du login (en fait c'est lui qui validera un login après sortie du fromulaire).

          Il vous faut donc trouver un événement déjà prévu dans le framework et correspondant à votre besoin (donc l'entré dans votre site Joomla).
          voir : https://docs.joomla.org/Plugin/Events/fr

          A priori tu veux que le login soit totalement automatique (pas d'appel au formulaire identifiant/mot de passe par un utilisateur déjà connu de votre intranet, lorsqu'il accède à votre site Joomla sur ce même intranet).

          Vous pouvez donc utiliser par exemple onAfterInitialise ​et ensuite lancer un login automatique.

          Pour faire un login automatique, tu peux t'inspirer du plugin system / remember qui permet d'effectuer le login automatique s'il n'est pas déjà fait et si un cookie de connexion valide existe sur le poste.

          Code PHP:
            public function onAfterInitialise()
            {
            
          // No remember me for admin.
            
          if ($this->app->isClient('administrator')) {
            return;
            }

            
          // Check for a cookie if user is not logged in
            
          if ($this->app->getIdentity()->get('guest')) {
            
          $cookieName 'joomla_remember_me_' UserHelper::getShortHashedUserAgent();

            
          // Check for the cookie
            
          if ($this->app->getInput()->cookie->get($cookieName)) {
            
          $this->app->login(['username' => ''], ['silent' => true]);
            }
            }
            }


          ​ 
          Ce plugin relance le app->login et donc l'evenement onUserAuthenticate des plugins du groupe authentication (et donc le plugin Cookie qui fera le login selon le cookie).

          Accessoirement ceci explique pourquoi il faut activer :
          • le plugin authentication/cookie
          • et le plugin system/remember

            afin que la coche "remember me / se souvenir de moi" de la boite de login fonctionne.
          Dans ton cas il te manque donc le plugin system qui gère l’événement onAfterInitialise qui soit fera le login directement, soit lancera ton plugin authentication par l'appel à $this->app->login(['username' => REMOTE_USER] par exemple
          Dernière édition par roland_d_alsace à 10/07/2023, 14h46
          woluweb aime ceci.
          A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
          Rejoignez le Joomla Users Groupe Alsace...
          roland_d_alsace va-t-il devenir roland_du_grand_est ?

          Commentaire


          • #6
            Merci pour toutes ces explications, c'est déjà une bonne piste de recherche !

            Commentaire


            • #7
              Bonjour,
              J'ai repris mon développement et j'ai réussi l'authentification en intégrant dans l'index.php de mon template l'appel à la fonction login.
              //recuperation user depuis REMOTE_USER
              $username=explode("@",$_SERVER["GSS_NAME"]);

              //On essaie de faire la connexion ici avec la fonction login dans app
              $options = array();
              $options[0] = "";
              $credentials = array();
              $password = "";
              $credentials['username'] = $username[0];
              $credentials['password'] = $password;

              //On lance la connexion automatique uniquement avec le code utilisateur
              $cnx = $app->login($credentials,$options);


              Nous avons constaté que le password n'était pas nécessaire et la connexion se fait. On récupère ainsi les droits particuliers de l'utilisateur.
              Par contre, si on n'a jamais été connecté et que l'on clique sur un lien qui a un accès direct à un article, l'authentification ne se fait pas et on ne peut pas voir l'article. Il faut re-cliquer sur le lien pour y accéder car authentification aura été faite.

              Donc, solution partielle on va dire.

              Commentaire

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X