解释
在 Symfony2 中允许用户切换到任何其他用户很容易。我的问题是,如何允许某些用户只切换到某些其他用户?我使用 FOSUserBundle 作为我的用户提供者。
例子
有 5 个用户,UserA、UserB、UserC、UserD、UserE,但其中只有 3 个链接在一起。
UserA 可以切换到 UserB 和 UserC
UserB 可以切换到 UserA 和 UserC
UserC可以切换到UserA和UserB
谢谢你的帮助!
解释
在 Symfony2 中允许用户切换到任何其他用户很容易。我的问题是,如何允许某些用户只切换到某些其他用户?我使用 FOSUserBundle 作为我的用户提供者。
例子
有 5 个用户,UserA、UserB、UserC、UserD、UserE,但其中只有 3 个链接在一起。
UserA 可以切换到 UserB 和 UserC
UserB 可以切换到 UserA 和 UserC
UserC可以切换到UserA和UserB
谢谢你的帮助!
你可以通过覆盖默认的 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
类作为自定义实现的基础。
如果您想将管理员用户模拟为普通用户,则有一些示例:)
https://gist.github.com/1589120
http://symfony.com/doc/current/book/security.html#impersonating-a-user
感谢 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;
}
如果您有其他解决方案,请告诉我 ++