Как проверить, играет ли пользователь определенную роль и, следовательно, разрешить некоторые действия?

Мне нужно проверить, есть ли у пользователя, вошедшего в систему, определенные роли в системе, поэтому я разрешаю или нет некоторые действия. Я использую 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";
}

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

2 ответа

Решение

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

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

Один быстрый поиск в Google сразу же вернул бы вам раздел документации об этом: http://symfony.com/doc/current/book/security.html

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

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

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

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

# app/config/security.yml
security:
    # ...
    access_control:
        - { path: ^/admin/users, roles: ROLE_SUPER_ADMIN }
        - { path: ^/admin, roles: ROLE_ADMIN }
Другие вопросы по тегам