2014-09-13 133 views
0

我正尝试使用FOS UserBundle来管理我的项目中的用户。FOS UserBundle访问被拒绝

这里是我的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; 
    } 

的$用户> 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已添加在我的测试)

但是,当我尝试达到像“/管理/我的/路线”的路线ñ我有一个403访问被禁止。

任何想法为什么Symfony不希望我的用户访问管理页面?

编辑:

当我在探查一下,用户只需[ROLE_USER] ...

谢谢。

+0

当你设置用户角色?在设置它们之前,symfony2安全系统可能正在查看您的用户角色。 – zizoujab 2014-09-13 22:20:15

+0

我将它们设置在我的控制器testGroupsAction中:我将“ROLE_ADMIN”添加到我的$用户,然后将其保存到我的数据库中。当我得到我的User对象时,当我使用$ user-> getRoles()(看看我的var_dump)时,我有这个“ROLE_ADMIN”。 因此,如果安全系统检查我的用户角色,它应该让我新添加的一个权利? 我使用profiler数据编辑了我的帖子。希望能帮助到你。 – 2014-09-13 22:25:23

+0

我怀疑你在添加角色时有问题,因为在profiler中只有'ROLE_USER'在那里。尝试使用命令行添加角色admin并查看发生了什么事情https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/command_line_tools.md#4-promote-a-user – zizoujab 2014-09-13 22:37:00

回答

1

我终于搞定了。

感谢Zizoujab,我试过FOSUserBundle的命令,以促进用户:

> php app/console fos:user:promote myUser 

它工作得很好。但是,因为我的服务器上没有ssh访问权限和任何其他命令行工具,所以我需要通过PHP代码来完成。

所以我去了使用FOS \ UserBundle \ Util \ UserManipulator对用户执行操作的命令代码FOS \ UserBundle \ Command \ PromoteUserCommand。

所以,如果你想直接在你的控制器中修改你的用户,你可以使用它,但我不知道这是否是最好的方法。只需通过像这样的容器调用它:

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

希望它有帮助。