Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SF 3.4] Config du security.yml

Sujet résolu
    8 janvier 2018 à 15:40:38

    Bonjour,

    Je développe une application sous Symfony 3.4.3 et je rencontre quelques problèmes sur la gestion des rôles et accès des utilisateurs.

    Cette application a besoin d'une authentification pour y accéder (en gros la page d’accueil est la page de login, une fois connecté on a accès à toute les pages). J'utilise FOS UserBundle pour la gestion d'utilisateur.

    Voici mon problème, dans mon security.yml :
    - si j'accepte les anonymes : on a accès à la page de /login et ma page /dashboard on peut y accédé en tant que connecté et anonyme.
    - si je refuse les anonymes : on n'a plus accès à la page login et ma page dashboard non plus puisqu'il faut être connecté.

    J'ai peut-être loupé une config, quelqu'un peut m'éclairer ?

    Voici mon security.yml

    security:
        encoders:
            FOS\UserBundle\Model\UserInterface: bcrypt
        role_hierarchy:
            ROLE_ADMIN:       ROLE_USER
            ROLE_SUPER_ADMIN: ROLE_ADMIN
        # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
        providers:
            fos_userbundle:
                id: fos_user.user_provider.username
    
        firewalls:
            # disables authentication for assets and the profiler, adapt it according to your needs
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            
            main:
                pattern: ^/
                provider: fos_userbundle
                form_login:
                    login_path: fos_user_security_login
                    csrf_token_generator: security.csrf.token_manager
                    always_use_default_target_path : true
                    default_target_path: core_dashboard
                    use_referer : true
                    check_path: fos_user_security_check
                logout:
                    path: fos_user_security_logout
                logout_on_user_change: true
                anonymous:    true
    
        access_control:
            - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/dashboard, role: ROLE_USER }
    



    -
    Edité par lex--77 8 janvier 2018 à 15:41:07

    • Partager sur Facebook
    • Partager sur Twitter
      10 janvier 2018 à 14:14:15

      Petit Up !

      Peut-être que je me suis mal exprimé en gros voila ce que je souhaite faire :
      - mon application Symfony est accessible uniquement avec compte.
      - les pages de login de FOSUserBundle doit donc être accessible par les anonymes
      - les autres pages sont accessible si connecté avec le ROLE_USER (les anonymous ne sont pas autorisés)

      Dans le security.yml (ci-dessus), c'est ce que je pensais mettre en place mais en faisant des test ce n'est pas le cas.
      Je m'explique :
      cas 1
      - sur ma page login je suis en anonymous et je peux me connecter.
      - une fois connecté, j'ai donc accès à la page dashboard avec le ROLE_USER

      cas 2
      - je ne suis pas connecté et je tente d’accéder à la page dashboard.
      - je suis bien sur la page dashboard mais en tant que anonymous 

      J'ai également essayé de faire un 2e firewall (1 pour l'application et l'autre pour les pages login de FOSUserBundle) mais pour les deux firewall le profiler m'indique qu'il faut renseigner form_login. Je ne vois pas trop l'intérêt de faire deux firewall avec le même form_login.

      Peut-être que j'ai loupé une étape ?

      • Partager sur Facebook
      • Partager sur Twitter
        10 janvier 2018 à 17:38:44

        Salut !

        Et si tu mettais une route "fourre-tout"^/ plutôt que de spécifier ^/dashboard ?

        -
        Edité par Ymox 10 janvier 2018 à 17:39:15

        • Partager sur Facebook
        • Partager sur Twitter
          11 janvier 2018 à 10:07:46

          Salut,

          Merci pour ton retour.

          Malheureusement j'ai déjà tenté et voici ce que j'ai tenté :
          cas 1 :

          - { path: ^/, role: is_authenticated_remembered }

          J'ai une erreur 500 (ERR_TOO_MANY_REDIRECTS), on demande a être connecté donc on redirige vers la page /login qui demande aussi a être connecté donc on redirige vers login jusqu'à l'erreur 500. J'ai aussi essayé avec is_authenticated_fully

          cas 2 :

          - { path: ^/, role: ROLE_ADMIN }

          Erreur 500, même résultat que le cas 1.

          J'ai voulus essayer de faire un 2e firewall mais il faut obligatoirement form_login dans les 2 firewall, du coup je trouve ça redondants de dupliquer 2 firewall avec presque les même config. Il me prend qu'un seul firewall (main celui qui a anonymous à false donc erreur 500)

                main_login:
                      pattern: ^/(login$|register|resetting)
                      provider: fos_userbundle
                      form_login:
                          login_path: fos_user_security_login
                          csrf_token_generator: security.csrf.token_manager
                          always_use_default_target_path : true
                          default_target_path: core_dashboard
                          use_referer : true
                          check_path: fos_user_security_check
                      logout:
                          path: fos_user_security_logout
                      logout_on_user_change: true
                      anonymous:    true
                      remember_me:
                          secret:      "%secret%"
                          lifetime: 604800 # 1 week in seconds
                          domain:   ~ 
                          secure:   true
                  main:
                      pattern: ^/
                      form_login:
                          login_path: fos_user_security_login
                          csrf_token_generator: security.csrf.token_manager
                          always_use_default_target_path : true
                          default_target_path: core_dashboard
                          use_referer : true
                          check_path: fos_user_security_check
                      logout:
                          path: fos_user_security_logout
                      anonymous:    false



          J'ai voulus intervertir l'odre des firewall dans le security.yml mais ça ne change rien.

          J'ai tenté pleins de chose sans trouver de solutions.

          -
          Edité par lex--77 11 janvier 2018 à 10:10:41

          • Partager sur Facebook
          • Partager sur Twitter
            11 janvier 2018 à 10:22:52

            Je pense que l'autre solution serait de sécuriser explicitement chaque route qui doit l'être…

            Je n'entrevois pas d'autre solution.  :(

            • Partager sur Facebook
            • Partager sur Twitter
              11 janvier 2018 à 15:49:11

              Une autre possibilité, déclarer tout ce qui doit être privé (accessible après authentification) comme étant dans un répertoire spécifié. Il suffit de changer les routes dans routing.yml et d'ajouter ce répertoire (fictif) à la racine :

              Par exemple :

              dashboard:
                  path: /dashboard
              
              

              devient :

              dashboard:
                  path: /espace/dashboard
              


              Et tu règles ton parefeu :

              main:
                  pattern: ^/espace/




              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2018 à 15:03:57

                Hello,

                Tu peux désactiver la sécurité pour ta page d'accueil / login. Regarde comment est fait ton firewall "dev". Ça te permet de mettre anonymous à false sur ton firewall suivant "main" afin d'interdire l'accès à toutes les autres pages.

                • Partager sur Facebook
                • Partager sur Twitter
                  15 janvier 2018 à 11:40:01

                  Bonjour à tous,

                  Merci pour vos réponses, j'ai tenté plusieurs chose sans résultat.

                  @Ymox J'ai essayé sans résultat, en regardant dans le profiler il me prends le même firewall main.

                  @HarvestR, voici les différents cas :

                  cas 1

                          main_login:
                              pattern: ^/
                              security: true
                              provider: fos_userbundle
                              form_login:
                                  login_path: fos_user_security_login
                                  check_path: fos_user_security_check
                                  csrf_token_generator: security.csrf.token_manager
                                  always_use_default_target_path : true
                                  default_target_path: core_dashboard
                                  use_referer : true
                              logout:
                                  path: fos_user_security_logout
                              logout_on_user_change: true
                              anonymous:    true
                              remember_me:
                                  secret:      "%secret%"
                                  lifetime: 604800 # 1 week in seconds
                                  domain:   ~ # Defaults to the current domain from $_SERVER
                                  secure:   true
                          main:
                              pattern: ^/espace
                              provider: fos_userbundle
                              security: true
                              form_login:
                                  login_path: fos_user_security_login
                                  check_path: fos_user_security_check
                                  csrf_token_generator: security.csrf.token_manager
                                  always_use_default_target_path : true
                                  default_target_path: core_dashboard
                                  use_referer : true
                              logout:
                                  path: fos_user_security_logout
                              logout_on_user_change: true
                              anonymous:    false
                              remember_me:
                                  secret:      "%secret%"
                                  lifetime: 604800 # 1 week in seconds
                                  domain:   ~ # Defaults to the current domain from $_SERVER
                                  secure:   true
                        

                  La fonction login fonctionne bien mais dans toutes les URLs c'est le parefeu main_login qui est utilisé. Du coup sur ma page /espace/dashoard ce n'est pas le parefeu 'main' qui est utilisé mais 'main_login' qui autorise les anonymes.

                  cas 2 

                          main_login:
                              pattern: ^/(login|login_check|register|resetting|logout) #[a-z]{2}/
                              security: true
                              provider: fos_userbundle
                              form_login:
                                  login_path: fos_user_security_login
                                  check_path: fos_user_security_check
                                  csrf_token_generator: security.csrf.token_manager
                                  always_use_default_target_path : true
                                  default_target_path: core_dashboard
                                  use_referer : true
                              logout:
                                  path: fos_user_security_logout
                              logout_on_user_change: true
                              anonymous:    true
                              remember_me:
                                  secret:      "%secret%"
                                  lifetime: 604800 # 1 week in seconds
                                  domain:   ~ # Defaults to the current domain from $_SERVER
                                  secure:   true
                          main:
                              pattern: ^/espace
                              provider: fos_userbundle
                              security: true
                              form_login:
                                  login_path: fos_user_security_login
                                  check_path: fos_user_security_check
                                  csrf_token_generator: security.csrf.token_manager
                                  always_use_default_target_path : true
                                  default_target_path: core_dashboard
                                  use_referer : true
                              logout:
                                  path: fos_user_security_logout
                              logout_on_user_change: true
                              anonymous:    false
                              remember_me:
                                  secret:      "%secret%"
                                  lifetime: 604800 # 1 week in seconds
                                  domain:   ~ # Defaults to the current domain from $_SERVER
                                  secure:   true

                  - ma page /login, il ne détecte pas de parefeu du coup quand je me connecte, il m'affiche l'erreur 'You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.' 
                  - les pages /espace et espace/dashboard s'affichent bien mais sans parefeu (donc pas d'authentification obligatoire).

                  @Winzou, c'est plus ou moins pareille que les deux cas précédent

                  cas 1

                          main_login:
                              pattern: ^/ 
                              security: false
                              .... autres configs
                          main:
                              pattern: ^/espace/ #j'ai essayé aussi ^/espace/dashboard
                              security: true
                              .... autres configs

                  - page login avec le parefeu 'main_login' mais message erreur 'You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.' 
                  - les autres pages ont le parefeu 'main_login' donc pas d'authentifications obligatoire.

                  cas 2 

                          main_login:
                              pattern: ^/(login$|register|resetting|logout)
                              security: false
                          main:
                              pattern: ^/espace/ #j'ai essayé aussi ^/espace/dashboard
                              security: true

                  - la page /login n'a pas de parefeu -> du coup même d'erreur du check path.
                  - les autres pages pas de parefeu donc pas d'authentification obligatoire.

                  Pour l'instant la seule solution qui marche, c'est de vérifier le rôle dans tous les controleurs qui génère une. En gros si connecté affiche la vue sinon la page login. Cette solution ne me convient pas il faut le faire dans chaque controlleur qui génère une vue, pas top.

                  Je continue de chercher mais si vous avez d'autres pistes, je suis prenneur.

                  EDIT : je ne sais pas si ça joue mais j'ai mis la locale en préfix sur toutes mes route dans mon routing.yml dans app. Toutes mes URL sont toutes du type mon-site.com/fr/ ou mon-site.com/en/

                  -
                  Edité par lex--77 15 janvier 2018 à 11:44:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 janvier 2018 à 11:54:58

                    Attention à ne pas tout confondre :)

                    • Ta page de login (formulaire) est en "/". Celle-ci n'a pas besoin d'être derrière un quelconque pare-feu, ce n'est qu'un formulaire html.
                    • Ta page de login_check, celle qui reçoit la soumission du formulaire, est en "/login_check". C'est cette page qui doit être derrière le pare-feu pour lequel tu cherches à t'identifier. C'est elle qui génère l'erreur "You must configure the check path...".
                    • Tes pages protégées qui sont en "/espace/..." si j'ai bien compris. Elles doivent se trouver dans le même pare-feu que la route login_check.
                    • Ta locale : est-ce que tu as /fr/login_check ou juste /login_check ? Est-ce que tu as /fr/espace ou juste /espace ? Ça change tout pour ton paramètre pattern dans tes pare-feu.

                    Je pense que je t'ai donné toutes les clés pour résoudre ton problème ;)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 janvier 2018 à 16:39:01

                      Oui effectivement je me suis un peu embrouillé ^^

                      Merci Winzou pour tes indications, j'ai pu résoudre le problème grâce à toi (et merci aussi à HarvestR et Ymox d'avoir pris le temps pour m'aider).

                      Voila ce que j'ai fait :
                      - supprimé le sous-dossier "espace"
                      - mise en place d'un firewall (main_login) sur mes pages login,register, logout,resetting en autorisant les anonymes
                      - mise en place d'un firewall (main) sur mes autres pages avec interdiction d'anonyme
                      - inclusion de la locale dans le pattern des deux firewall
                      - pour garder la sessions utilisateur entre les deux firewall j'ai ajouté un context:user.

                      Voila la config de mes deux parefeu :

                              main_login:
                                  pattern: ^/[a-z]{2}/(login|register|resetting|logout)
                                  context: user
                                  anonymous:    true
                                  form_login:
                                      login_path: fos_user_security_login
                                      check_path: fos_user_security_check
                                      csrf_token_generator: security.csrf.token_manager
                                      use_referer : true
                                      always_use_default_target_path : true
                                      default_target_path: core_dashboard
                                  logout:
                                      path: fos_user_security_logout
                                  logout_on_user_change: true
                                  remember_me:
                                      secret:      "%secret%"
                                      lifetime: 604800 # 1 week in seconds
                                      domain:   ~ 
                                      secure:   true
                              main:
                                  pattern: ^/[a-z]{2}/
                                  context: user
                                  provider: fos_userbundle
                                  security: true
                                  form_login:
                                      login_path: fos_user_security_login
                                      check_path: fos_user_security_check
                                      csrf_token_generator: security.csrf.token_manager
                                  logout:
                                      path: fos_user_security_logout
                                  logout_on_user_change: true
                                  anonymous:    false
                                  remember_me:
                                      secret:      "%secret%"
                                      lifetime: 604800 # 1 week in seconds
                                      domain:   ~ 
                                      secure:   true

                      -
                      Edité par lex--77 15 janvier 2018 à 16:40:10

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [SF 3.4] Config du security.yml

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown