2014-09-13 4 views
0

Я пытаюсь использовать FOS UserBundle для управления пользователями в моем проекте.FOS UserBundle Access Denied

Вот мой security.yml файл:

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 } 

я вручную установить права моего пользователя в мой контроллер, как показано ниже:

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; 
    } 

в $ user-> getRoles (функция) возвращает мне массив со всеми ролями моего пользователя:

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 был добавлен во время моих тестов)

Однако, когда я пытаюсь достичь маршрута, например «/ admin/my/route», у меня есть запрет доступа 403.

Любая идея, почему Symfony не хочет, чтобы мой пользователь обращался к страницам администратора?

Edit:

Когда я смотрю в профайлер, пользователь имеет только [ROLE_USER] ...

Спасибо.

+0

Когда вы устанавливаете роли пользователя? Система Symfony2 может просматривать ваши роли пользователей до их установки. – zizoujab

+0

Я установил их в свой контроллер testGroupsAction: я добавляю «ROLE_ADMIN» к моему $ user, а затем сохраняю его в своей базе данных. Когда я верну свой объект User, у меня есть этот «ROLE_ADMIN», когда я использую $ user-> getRoles() (посмотрите на мой var_dump). Итак, если система безопасности проверяет роли моего пользователя, она должна получить мою недавно добавленную право? Я редактировал свой пост с данными профилировщика. Надеюсь, поможет. –

+0

Я сомневаюсь, что у вас возникли проблемы с добавлением ролей, поскольку в профилировщике существует только «ROLE_USER». попробуйте добавить роль admin с командной строкой и посмотреть, что происходит https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/command_line_tools.md#4-promote-a-user – zizoujab

ответ

1

Я, наконец, получил его работу.

Благодаря Zizoujab, я попытался команды FOSUserBundle, чтобы продвинуть пользователя:

> php app/console fos:user:promote myUser 

Он работал отлично. Однако, поскольку у меня нет доступа к SSH или какого-либо другого инструмента командной строки на моем сервере, мне нужно было сделать это с помощью PHP-кода.

Итак, я пошел в командный код FOS \ UserBundle \ Command \ PromoteUserCommand, который использует FOS \ UserBundle \ Util \ UserManipulator для выполнения действий над пользователем.

Итак, если вы хотите изменить своего пользователя непосредственно в своем контроллере, вы можете его использовать, но я не знаю, является ли это лучшим способом. Просто позвоните через ваш контейнер следующим образом:

/** 
* @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(); 
} 

Надеюсь, что это поможет.