【问题标题】:Symfony2: Check the user object in the controllers, best practiceSymfony2:检查控制器中的用户对象,最佳实践
【发布时间】:2013-03-20 09:18:33
【问题描述】:

在控制器中检查 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 }} 的视图中,这仅在@987654327 中实现@class ..,我会出错吗?

【问题讨论】:

    标签: php security symfony


    【解决方案1】:

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

    如果您实现了多种用户类型,最好让它们共享一个通用界面。您还可以覆盖每个类的“getRole”方法,这样每个类型都会返回一个定义其类型的额外角色,然后使用访问控制过滤掉不需要的类型。

    【讨论】:

      【解决方案2】:

      最好使用这种条件。

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

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

      【讨论】:

      • 但是会不会有 ROLE_* 在多个用户类之间共享?
      • 在这种情况下,您可以为每个用户类添加一个角色。此外,为您的功能管理角色。例如 ROLE_USER_ADMIN 或 ROLE_USER_CUSTOMER 和一个函数 ROLE_EDITOR。
      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多