9

解释

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

例子

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

UserA 可以切换到 UserB 和 UserC

UserB 可以切换到 UserA 和 UserC

UserC可以切换到UserA和UserB

谢谢你的帮助!

4

3 回答 3

15

你可以通过覆盖默认的 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类作为自定义实现的基础。

于 2012-12-08T23:10:09.100 回答
2

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

https://gist.github.com/1589120

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

于 2012-11-14T08:47:07.357 回答
0

感谢 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;
}

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

于 2015-03-04T12:29:50.470 回答