【问题标题】:Allow switching/impersonating only to particular users in Symfony2只允许在 Symfony2 中切换/模拟特定用户
【发布时间】:2012-11-14 00:48:31
【问题描述】:

解释

在 Symfony2 中允许用户切换到任何其他用户很容易。我的问题是,如何允许某些用户只切换到某些其他用户?我使用 FOSUserBundle 作为我的用户提供者。

示例

有 5 个用户,UserA、UserB、UserC、UserD、UserE,但其中只有 3 个链接在一起。

UserA可以切换到UserB和UserC

UserB 可以切换到 UserA 和 UserC

UserC可以切换到UserA和UserB

感谢您的帮助!

【问题讨论】:

    标签: symfony switch-statement


    【解决方案1】:

    你可以通过覆盖默认的 SwitchUserListener 来实现这种类型的东西。

    您要覆盖的参数是:security.authentication.switchuser_listener.class

    例如在parameters.yml中:

    parameters:
      security.authentication.switchuser_listener.class: My\Project\Security\Listener\SwitchUserListener
    

    在您的自定义侦听器类中,您将实现 Symfony\Component\Security\Http\Firewall\ListenerInterface 并使用现有的 Symfony\Component\Security\Http\Firewall\SwitchUserListener 类作为自定义实现的基础。

    【讨论】:

    • 像魅力一样工作。谢谢!
    【解决方案2】:

    如果您想将管理员用户模拟为普通用户,有一些示例 :)

    https://gist.github.com/1589120

    http://symfony.com/doc/current/book/security.html#impersonating-a-user

    【讨论】:

    • 据我了解,一旦用户拥有 ROLE_ALLOWED_TO_SWITCH,他/她可以将 ?_switch_user=anyusernamethatexists 附加到 url 并能够切换到该用户。如何允许用户只切换到某些其他用户?
    • 我想那是有一些切换用户监听器。我将检查 symfony 源代码。
    • 你查过源码了吗?感谢您的帮助!
    • Symfony 文档链接已更改:symfony.com/doc/current/cookbook/security/…
    【解决方案3】:

    感谢 Veonik,这是一种(可能是肮脏的)方法

    使用该语法添加角色:

     ROLE_ALLOWED_TO_SWITCH_{usertype}
    

    例如将 ROLE_A 添加到 userA :

    ROLE_A:
     - ROLE_ALLOWED_TO_SWITCH_USERTYPEB
     - ROLE_ALLOWED_TO_SWITCH_USERTYPEC
    

    在 yml 中声明你自己的 SwitchUserListener 服务:

    security.authentication.switchuser_listener:
      class: %security.authentication.switchuser_listener.class%
      public: false
      abstract: true
      tags:
          - { name: monolog.logger, channel: security}
      arguments: 
       - @security.context
       - null
       - @security.user_checker
       - null
       - @security.access.decision_manager
       - @logger
       - _switch_user
       - ROLE_ALLOWED_TO_SWITCH 
       - @event_dispatcher
       - @security.role_hierarchy
    

    在 SwitchUserListener::attemptSwitchUser 方法中

    private function attemptSwitchUser(Request $request)
    {
     ....
     CODE BEFORE
     ....
        $user = $this->provider->loadUserByUsername($username);
        $rtoSwith = $this->getRolesToSwitchTo($token->getRoles());
        $accessGranted = false;
        foreach ($rtoSwith as $suType) {
            $instance = ucfirst(strtolower($suType));
            if ($user instanceof $instance) {
                $accessGranted = true;
                break;
            }
        }
    
        if (!$accessGranted) {
    
            throw new AccessDeniedException('Access Denied, not allowed to switch to type : '.get_class($user));
        }
     ....
     CODE AFTER 
     ....
     return $token
    }
    
    protected function getRolesToSwitchTo($roles){
    
        $rts = array();
        foreach ($this->roleHierarchy->getReachableRoles($roles) as $role) {
    
            $tmp = explode("ROLE_ALLOWED_TO_SWITCH_", $role->getRole());
    
            if(isset($tmp[1])){
                $rts[] = $tmp[1];
            }
        }
    
        return $rts;
    }
    

    如果您有其他解决方案,请告诉我 ++

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2021-09-08
      • 2013-09-15
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多