2011-06-16 16 views
21

Symfony2 ile oluşturulmuş bir uygulamada, diğer kullanıcıların kimliğine bürünmelerini sağlamak için süperaderlerin olmasını istiyoruz. Bu, superadmin kullanıcısına ROLE_ALLOWED_TO_SWITCH rolünü vererek kolayca yapılabilir. Anahtarlama, referans belgelerinde gösterildiği gibi "bir yere? _switch_user =" çağrısıyla gerçekleştirilir.Symfony2'de bir kullanıcının kimliğine bürünme nasıl belirlenir?

Ancak, sorun, geçerli kullanıcı aslında "bir yere? _switch_user = _exit" sayfasına bir sayfa yazdırmak için kimliğine bürünmüşse, böylece kimliğe bürünen kullanıcının gerçek kullanıcısına dönmesine olanak sağlaması durumunda bir şablonda algılanmasıdır. .

cevap

29

Symfony2'yi bir süredir kullanmıyorum, bu yüzden emin değilim, ancak başka bir kullanıcıya geçtiğinizde, o kullanıcıya atanan tüm roller ve bir ekstra rol kazanırsınız: ROLE_PREVIOUS_ADMIN. Bu yüzden yapmanız gereken tek şey, seçmen kullanan mevcut kullanıcıya böyle bir rolün atanıp atanmadığını kontrol etmek için seçmen kullanmaktır.

// 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 ?> 
+2

taklitçi kimliği almak için yine de var mı? Kişileraratörün güncellemeleri yaptığı senaryolar için faydalı olacaktır ve denetim izinin taklit edenin orijinal kimliğini tanımasını istiyoruz. – anushr

+0

@anushr: evet, '? _switch_user = _exit' işlevini kullanın ([2.3] 'den beri var (http://symfony.com/doc/2.3/cookbook/security/impersonating_user.html). Ek bilgi için –

18

taklitçi hakkında daha fazla bilgi almak için nasıl bir örnek: Bu durumda, özgün kullanıcı nesnesi olarak admin_user sahip

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(); 
    } 
    } 
} 

. SwitchUserRole kullanmayı unutmayın.

+0

+1. – flu

+2

+1 bana adresini ver ve ben sana kurabiye yollayacağım. – Ascherer

+1

Ancak, dikkat etmeniz gereken bir husus da, kullanıcınız üzerinde yabancı tuşların bulunması durumunda, güvenliğin – Ascherer

2

dal içinde taklitçi nasıl görüntüleneceğini bir örnek:

{% 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 %} 
+0

nemlendirilmiş öğeleri olmayacaktır. Bunu Symfony3'te nasıl yapacağınızı biliyor musunuz? 'App.security' değişkeni kullanımdan kaldırıldı ve kaldırıldı ve şimdi en son sürüme güncellediğimiz bir alternatif arıyorum. – user128216

+1

@FighterJet, app.security yerine "app.token_storage" işlevini kullanır. – WayFarer

+0

'app.token_storage', [docs] 'a göre kullanılabilir görünmüyor (http://symfony.com/doc/current/reference/twig_reference .html # app) ... – user128216

İlgili konular