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


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 }}的视图,这只在Acme'UserBundle'User类中实现。那我就错了?

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

如果你实现了多种用户类型,让它们共享一个公共接口可能是个好主意。你也可以在每个类上重写"getRole"方法,这样每个类型都会返回一个定义其类型的额外角色,然后使用访问控制来过滤不需要的类型。

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

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

您可以选择在您的安全性中定义的您自己的"ROLE"。yml文件。