Symfony2:检查控制器中的用户对象,最佳实践

时间:2013-03-20 09:18:34

标签: php security symfony

最好在控制器中检查getUser() security.context服务的public function editAction() { $user = $this->container->get('security.context')->getToken()->getUser(); if (!is_object($user) || !$user instanceof \Acme\UserBundle\User) { throw new AccessDeniedException('This user doesn't have access'); } // work with $user // .... 调用的对象实际上是我的自定义用户类的对象吗?

getUser()

唯一可以保证的是Symfony\Component\Security\Core\User\UserInterface返回一个实现{{ user.biography }}的对象,没有别的,对吗?

这意味着控制器可能会接收任何类型的对象(可能是一个匿名的标记),所以如果我将对象直接传递给({没有控制它)对象后来调用Acme\UserBundle\User,这只在{{1}}上课..,我会犯错误吗?

2 个答案:

答案 0 :(得分:2)

如果您的配置允许这种可能性,这是一个好主意。如果允许匿名用户或实现多个类型,则可能会发生这种情况。

在实现多种用户类型时,最好让它们共享一个公共接口。您还可以在每个类上覆盖“getRole”方法,以便每个类型返回一个额外的角色来定义它的类型,然后使用访问控制来过滤掉不需要的类型。

答案 1 :(得分:0)

最好使用这种条件。

public function editAction()
{
    if (!$this->get('security.context')->isGranted('ROLE_USER')) {
        return  $this->redirect($this->generateUrl('frontend_cart_login'));
    }
...

您可以在security.yml文件中选择自己的“ROLE”。