在使用Symfony2構建的應用程序中,我們希望superadmins能夠模擬其他用戶。這很容易通過給超級用戶使用ROLE_ALLOWED_TO_SWITCH角色來完成。切換是通過調用參考文檔中的「somewhere?_switch_user =」來實現的。如何識別用戶是否正在模擬Symfony2?
但是,問題是要檢測模板中當前用戶是否實際模擬,以便在頁面上打印指向「somewhere?_switch_user = _exit」的鏈接,從而使模擬用戶能夠返回到其真實用戶。
在使用Symfony2構建的應用程序中,我們希望superadmins能夠模擬其他用戶。這很容易通過給超級用戶使用ROLE_ALLOWED_TO_SWITCH角色來完成。切換是通過調用參考文檔中的「somewhere?_switch_user =」來實現的。如何識別用戶是否正在模擬Symfony2?
但是,問題是要檢測模板中當前用戶是否實際模擬,以便在頁面上打印指向「somewhere?_switch_user = _exit」的鏈接,從而使模擬用戶能夠返回到其真實用戶。
我沒有使用Symfony2一段時間,所以我不確定,但是當您切換到另一個用戶時,您將獲得分配給該用戶的所有角色和一個額外角色:ROLE_PREVIOUS_ADMIN
。所以我想你所需要做的就是使用投票者來檢查這個角色是否被分配給使用選民的當前用戶。
// Twig
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
<a href="...?_switch_user=_exit">EXIT</a>
{% endif %}
// PHP
<?php if ($view['security']->isGranted('ROLE_PREVIOUS_ADMIN')): ?>
<a href="...?_switch_user=_exit">EXIT</a>
<?php endif ?>
的如何獲取有關假冒者更詳細情況的一例:
use Symfony\Component\Security\Core\Role\SwitchUserRole;
$sec = $this->get('security.context');
if($sec->isGranted('ROLE_PREVIOUS_ADMIN')) {
foreach($sec->getToken()->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$admin_user = $role->getSource()->getUser();
}
}
}
你就必須admin_user作爲原始用戶對象。請記住使用SwitchUserRole。
如何顯示在樹枝冒領的一個例子:
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
{% for role in app.security.token.roles %}
{% if role.role == 'ROLE_PREVIOUS_ADMIN' %}
{{ role.source.user.username }}
{% endif %}
{% endfor %}
{% endif %}
你知道在Symfony3中如何做到這一點嗎? 'app.security'變量已被棄用和刪除,現在我正在尋找替代方案,現在我們正在更新到最新版本。 – user128216 2016-04-22 12:02:43
@FighterJet使用'app.token_storage'而不是app.security – WayFarer 2016-04-22 12:43:18
'app.token_storage'似乎不可用,根據[docs](http://symfony.com/doc/current/reference/twig_reference .html#app)... – user128216 2016-04-22 13:26:39
反正是有讓假冒者的id?這對模擬器正在進行更新的場景很有用,我們希望審計線索能夠識別模擬器的原始ID。 – anushr 2011-10-13 12:08:34
@anushr:是的,使用'?_switch_user = _exit'(它至少存在於[2.3](http://symfony.com/doc/2.3/cookbook/security/impersonating_user.html))。 – 2015-12-08 16:45:00