Проверьте, есть ли у подписанного пользователя определенная роль в Symfony 2 & 3

Система безопасности Symfony невероятно мощная и позволяет вам добавлять роли своим пользователям. Когда пользователь входит в систему, он получает набор ролей (например, ROLE_ADMIN). Они, вероятно, хранятся в столбце вашей таблицы (или в памяти) и объявляются в файле security.yml вашего проекта.

В представлении (веточка)

В представлении, если вы используете twig в качестве предпочитаемого обработчика шаблонов, вы можете использовать следующий код, чтобы проверить, имеют ли сеанс необходимые роли.

{#
We will use the is_granted twig function, this will return a boolean according to the statement, to check a specific role use :
#}
{% if is_granted('ROLE_ADMIN') %}
Do something here
{%endif%}

Например, если вы хотите создать меню входа и выхода для всех пользователей (всех ролей), вы сможете создать его так:

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}

Sign out

{% else %}
Sign in
{% endif %}

В контроллере (.php файлы)

Чтобы проверить активную роль пользователя в контроллерах, мы будем использовать метод isGranted, который можно получить из контекста безопасности Symfony. Используйте следующий код для проверки роли в php.

// If you are in a symfony controller
if ($this->get('security.context')->isGranted('ROLE_ADMIN')) {
// Execute some php code here
}
// Or if you are using a symfony extension (and you are injecting the container)
//Note that you need to have a variable defined as the symfony container (for example in a symfony extension you send it as parameter)
$container = someMethodThatRetrievesTheSymfonyContainer();
if($this->container->get('security.context')->isGranted('ROLE_ADMIN')){
//Execute some php code
}
// If you just want to prevent that a user without a specific role enter to some area, you can use the latest shortcut in the controllers:
$this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page :( you are not admin');

Если пользователь имеет роль в базе данных

Если пользователь не активен (зарегистрирован) и вам нужно проверить, есть ли у пользователя определенная роль из базы данных, вы можете использовать эту функцию, чтобы выяснить это.

Функция ожидает в качестве первого параметра идентификатор пользователя, а в качестве второго параметра — имя роли, помните, что ваша структура пользователя может отличаться, и вам необходимо изменить способ поиска, например, поиск по другому полю, а не по идентификатору.

/**
* @string|int $id
* @string $role
*/
public function userHasRole($id ,$role) {
// Entity manager
$em= $this->getDoctrine()->getManager()
$qb = $em->createQueryBuilder();
$qb->select('u')
->from('userBundle:User', 'u') // Change this to the name of your bundle and the name of your mapped user Entity
->where('u.id = :user')
->andWhere('u.roles LIKE :roles')
->setParameter('user', $id)
->setParameter('roles', '%"' . $role . '"%');
$user = $qb->getQuery()->getResult();
if(count($user) >= 1){
return true;
}else{
return false;
}
}
// Then you can use it like :
$devId = 123;
if(userHasRole($devId,"ROLE_DEVELOPER")){
// Send mail to DEVELOPERS
}
Ссылка на основную публикацию
Adblock
detector