Bonjour,

Voila je travail sur Symfony 4 et sur le module Security de Symfony.
J'ai besoin de personnaliser l'authentification de mes utilisateurs sans passer par des plugins tel que Fosuser.
Ceci pour les raisons suivantes :

  • L' utilisateur se connecte sur un serveur "principal" (ldap) avec son login/password
  • Je dois pouvoir récupérer ses identifiants pour tester son compte sur d'autres serveurs ldap en parallèle.
  • Lorsque l'utilisateur est bien authentifié sur le principal, l'utilisateur est redirigé vers une page lui indiquant si tout est ok ou pas sur les autres serveurs. Dans le cas ou ça ne l'est pas, il a la possibilité de mettre à jour son compte.

Seulement voilà, la documentation traite de cas "simple" et là je suis un peu perdu.
J'ai testé plusieurs possibilités (authentification avec Guard, test de création d'un provider personnalisé ...) sans résultats.
Il faudrait que je comprenne bien les mécanismes de l'authentification sous symfony pour créer une authentification personnalisée.
Si quelqu'un a une piste pour me guider, ce serait super.

En vous remerciant par avance.

4 réponses


Bonjour Sebius,
Pas simple ton affaire!
Je sais que tu peux "chainer" les providers. Par exemple :

security:
    providers:
            chain_provider:
                chain:
                    providers: [fos_userbundle, fr3d_ldapbundle]
            fr3d_ldapbundle:
                id: fr3d_ldap.security.user.provider
            fos_userbundle:
                id: fos_user.user_provider.username

Ensuite dans la partie firewalls, tu définis le provider pour chaque zone:

firewall:
    main:
        ....
        provider: chain_provider

Si ça peux t'aider....

sebius
Auteur

Bonjour Digivia,
Merci pour ta réponse, seulement cela ne répond pas à mon problème. Si j'ai bien compris lorsque tu chaînes les providers, dés lors que l'utilisateur appartient à l'un des providers l'identification se fait.
Ma demande est particulière dans le sens ou il y a bien 1 seul provider (le ldap principal) pour l'authentification de l'utilisateur. Mais ensuite je dois tester une connexion avec les identifiants de l'utilisateur sur d'autres serveurs pour afficher un état de son compte. Dans le cas ou la connexion ne s'établit pas avec les autres serveurs, l'utilisateur à la possibilité via un simple bouton de synchroniser son compte. En php simple, j'y arrive avec l'aide des sessions en gardant l'identifiant et le mot de passe. Mais en Symfony, si je veux utiliser le bundle se sécurité, c'est beaucoup plus complexe mais cela me permettrait de sécuriser mon appli. Il faudrait que je puisse garder les identifiants (login/password) en session après sa connexion. Mais est-ce la bonne méthode???

Effectivement, tu n'y arriveras pas avec le chaînage de providers...
Tu peux regarder la partie authentification / sécurité dans la doc (https://symfony.com/doc/3.4/components/security/authentication.html) pour créer ces scénarios from scratch...
Mais est-ce la bonne solution de faire cela dans un MiddleWare?
Côté infra, tu as une marge de manoeuvre? C'est du windows AD tes serveurs LDAP? Si c'est le cas tu peux creuser du côté du Global Catalogue (https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc728188(v=ws.10)).
Il y a d'autres solution d'authentification ou d'autorisation via un serveur intermédiaire entre ton SF et les LDAP (oAuth, SAML...). A voir suivant la latitude que tu as pour customiser l'infra en amont...

sebius
Auteur

Côté infra, il s'agit de serveurs Linux avec openldap. Je vais regarder du côté authentification sur la doc symfony. Merci pour toutes les pistes données.