繁体   English   中英

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

[英]Symfony2: Check the user object in the controllers, best practice

在控制器中检查security.context服务的getUser()调用的对象实际上是我的自定义用户类的对象是一个好主意吗?

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 }}无需控制它)对象,随后调用{{ user.biography }} ,这只在Acme\\UserBundle\\User实现Acme\\UserBundle\\User class ..,我会犯一个错误?

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

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

最好使用这种类型的条件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM