2014-11-03 1 views
-1

Мне нужно проверить, имеет ли пользователь в системе определенные роли в системе, поэтому я допускаю или не выполняю некоторые действия. Я использую JMSSecurityExtraBundle, и я проверяю документы для Expression Based Authorization, но я делаю что-то неправильно, так как код не работает. Посмотрите на этот код:Как проверить, имеет ли пользователь определенную роль и, следовательно, разрешить некоторые действия?

use JMS\SecurityExtraBundle\Annotation\Secure; 
use JMS\SecurityExtraBundle\Security\Authorization\Expression\Expression; 

if ($this->get('security.context')->isGranted(array(new Expression('hasRole("ROLE_ADMIN")')))) { 
    echo "Enter"; 
} else { 
    echo "Do not enter"; 
} 

Но в любое время я авторизован даже ADMIN, которые имеют все права и ROLE_ADMIN, единственный текст, я вижу это «Не входить», который совершенно неправильно , В примере кода, описанном в here, автор использует $securityContext var, но откуда он берется? Где этот var определен? Я предполагаю, что он укажет на SecurityContext, но я не так уверен, где проблема с моим кодом? Как проверить, имеет ли пользователь определенную роль и, следовательно, разрешить выполнение какого-либо кода или нет?

+0

Почему бы вам просто не использовать '-> isGranted ('ROLE_ADMIN')'? –

+0

Как это? Не могли бы вы написать небольшой кусок кода, чтобы понять это? – ReynierPM

ответ

1

Вам не нужно любое использование аннотаций выражений, если вы просто хотите, чтобы проверить роли пользователя в контроллере, этого достаточно:

if ($this->get('security.context')->isGranted('ROLE_ADMIN')) { 
    echo "Enter"; 
} else { 
    echo "Do not enter"; 
} 

Один быстрый поиск по Google вернул бы вам документацию раздел о том, что право : http://symfony.com/doc/current/book/security.html#access-control

1

Я допускаю или не совершаю действия.

Если вы имеете в виду регулярные действия в контроллерах, то удобной ярлыкой является использование аннотации @Security от SensioFrameworkExtraBundle.

/** 
* @Security("has_role('ROLE_ADMIN')") 
*/ 
public function indexAction() 
{ 
    // ... 
} 

Но это не совсем способ, как вы должны разработать roled действия, основанные на Symfony 2. Вы можете определить его в access_control.

# app/config/security.yml 
security: 
    # ... 
    access_control: 
     - { path: ^/admin/users, roles: ROLE_SUPER_ADMIN } 
     - { path: ^/admin, roles: ROLE_ADMIN } 
+0

Это другой способ, но если у меня есть 500 контроллеров, тогда у меня будет 500 строк на 'security.yml', и это не идея, я предпочитаю передавать это в аннотации. На другой стороне я проверю ROLE для других условных не для полной функции, так или иначе спасибо – ReynierPM