2014-09-13 1 views
0

J'essaie d'utiliser FOS UserBundle pour gérer les utilisateurs de mon projet.FOS UserBundle Accès refusé

Voici mon security.yml fichier:

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
     FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

    providers: 
     in_memory: 
      memory: 
       users: 
        user: { password: userpass, roles: [ 'ROLE_USER' ] } 
        admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 

     fos_userbundle: 
      id: fos_user.user_provider.username 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true 

    access_control: 
     #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/, role: ROLE_ADMIN } 

J'ai mis manuellement les droits de mon utilisateur dans mon contrôleur comme ci-dessous:

public function testGroupsAction(UserInterface $user) 
    { 
     $user->addRole("ROLE_ADMIN"); 
     $this->getDoctrine()->getManager()->persist($user); 
     $this->getDoctrine()->getManager()->flush(); 

     echo "<pre>"; 
     \Doctrine\Common\Util\Debug::dump($user->getRoles()); 
     echo "</pre>";die; 
    } 

la fonction $ user-> getRoles() me retourne un tableau avec les rôles de tout mon utilisateur:

array (size=3) 
    0 => string 'ROLE_SUPER_ADMIN' (length=16) 
    1 => string 'ROLE_ADMIN' (length=10) 
    2 => string 'ROLE_USER' (length=9) 

(ROLE_SUPER_ADMIN a été ajouté lors de mes tests)

Cependant, lorsque j'essaie d'atteindre un itinéraire comme "/ admin/mon/route" n j'ai un accès 403 interdit.

Une idée de pourquoi Symfony ne veut pas que mon utilisateur accède aux pages d'administration?

Edit:

Quand je regarde dans le profileur, l'utilisateur ne dispose que [ROLE_USER] ...

Merci.

+0

lorsque vous définissez des rôles d'utilisateur? Le système de sécurité de symfony2 peut regarder vos rôles utilisateur avant de les définir. – zizoujab

+0

Je les ai définies dans mon contrôleur testGroupsAction: J'ajoute le "ROLE_ADMIN" à mon utilisateur $, puis je l'enregistre dans ma base de données. Quand je récupère mon objet Utilisateur, j'ai ce "ROLE_ADMIN" quand j'utilise $ user-> getRoles() (regardez mon var_dump). Donc, si le système de sécurité vérifie les rôles de mon utilisateur, il devrait obtenir mon nouvel ajouté droit? J'ai modifié mon message avec les données du profileur. J'espère que cela aide. –

+0

Je doute que vous ayez des problèmes dans l'ajout de rôles puisque dans le profileur seulement 'ROLE_USER' est là. essayez d'ajouter le rôle admin avec la ligne de commande et voyez ce qui se passe https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/command_line_tools.md#4-promote-a-user – zizoujab

Répondre

1

J'ai finalement réussi à le faire fonctionner.

Merci à Zizoujab, j'ai essayé les commandes de FOSUserBundle pour promouvoir un utilisateur:

> php app/console fos:user:promote myUser 

Il a parfaitement fonctionné. Cependant, comme je n'ai aucun accès ssh ni aucun autre outil de ligne de commande sur mon serveur, je devais le faire via du code PHP.

Donc je suis allé au code de commande FOS \ UserBundle \ Command \ PromoteUserCommand qui utilise FOS \ UserBundle \ Util \ UserManipulator pour faire des actions sur l'utilisateur. Par conséquent, si vous souhaitez modifier votre utilisateur directement dans votre contrôleur, vous pouvez l'utiliser, mais je ne sais pas si c'est la meilleure façon de le faire. Il suffit de l'appeler via votre conteneur comme ceci:

/** 
* @Route("/user/{id}", name="test_user") 
* @ParamConverter("user" , class="MyBundle:User") 
*/ 
public function testUserAction(UserInterface $user) 
{ 
    $userManipulator = $this->container->get("fos_user.util.user_manipulator"); 
    $userManipulator->addRole($user,'ROLE_ADMIN'); 

    return new Response(); 
} 

Espérons que cela aide.

Questions connexes