0

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类中实现..,我会犯错误?

4

2 回答 2

2

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

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

于 2013-03-20T09:59:54.960 回答
0

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

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

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

于 2013-03-20T09:21:45.063 回答