我尝试使用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] ...
谢谢。
答案 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();
}
希望它有所帮助。