FOS UserBundle访问被拒绝

时间:2014-09-13 16:06:35

标签: symfony fosuserbundle rights

我尝试使用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;
    }

$ user-&gt; 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)

然而,当我尝试到达&#34; / admin / my / route&#34;这样的路线时,我已经禁止进入403。

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

编辑:

当我查看探查器时,用户只有[ROLE_USER] ...

谢谢。

1 个答案:

答案 0 :(得分:2)

我终于明白了。

感谢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();
}

希望它有所帮助。