[英]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.