2013-06-12 3 views
6

Я хочу знать, имеет ли пользователь роль «VIEW_GEOLOC_DATA», но у меня есть проблема с использованием функции веточки is_granted().Twig/Symfony2: несколько ролей с is_granted

Если я использую в качестве шаблона:

Roles : {{ dump(app.user.getRoles()) }} 
is_granted('ROLE_SUPER_ADMIN') : {{ dump(is_granted('ROLE_SUPER_ADMIN')) }} 
is_granted('VIEW_GEOLOC_DATA') : {{ dump(is_granted('VIEW_GEOLOC_DATA')) }} 

Это то, что я получаю при рендеринге:

array(2) { 
    [0]=> 
    string(16) "ROLE_SUPER_ADMIN" 
    [1]=> 
    string(16) "VIEW_GEOLOC_DATA" 
} 
is_granted('ROLE_SUPER_ADMIN') : bool(true) 
is_granted('VIEW_GEOLOC_DATA') : bool(false) 

Я пытался войти в и, опорожнение кэш Symfony в.
Я также попытался изменить порядок ролей в массиве, возвращаемый метод getRoles() мой пользователя: функция is_granted будет принимать во внимание только первой роль массива

ответ

8

Я в конечном итоге создать новый метод hasRole в моем User Класс:

public function hasRole($role) 
{ 
    return in_array($role, $this->getRoles()); 
} 

Затем, в шаблоне, я использую:

{% if app.user.hasRole('ROLE_VIEW_GEOLOC_DATA') %} 
    {# do something #} 
{% endif %} 

EDIT: Как @ JonnyS сказал, возможно, что роли должны начинаться с ROLE_ для работы с is_granted Функция Symfony. Не тестировалось.

+6

в качестве ясности, возможно, непосредственно возвращает результат in_array, а не добавляет if/else: 'return in_array ($ role, $ this-> getRoles());' –

+1

Это не то же самое, что is_granted учетные записи для наследования ROLE , в то время как просто проверка того, имеет ли пользователь указанную роль, – Gamesh

8

Если вы ожидаете Symfony2 для обработки ваши роли, то ваши роли должны начинаться с «ROLE_».

Изменить

'VIEW_GEOLOC_DATA' 

в

'ROLE_VIEW_GEOLOC_DATA' 

Конечно, вам нужно изменить в вашей конфигурации и добавить новую роль.

Этот ответ не применяется, если вы используете выделенный класс Role.

+0

Я не использую класс ролей, это мое определение getRoles(): 'общественная функция getRoles() { если ($ this-> роль == 100) возвращает массив ('ROLE_SUPER_ADMIN', 'VIEW_GEOLOC_DATA'); } ' Но поведение такое же, как [Управление ролями в базе данных] (http://symfony.com/doc/2.1/cookbook/security/entity_provider.html#managing-roles-in-the-database) –

+2

Попробуйте изменить его, чтобы использовать префикс «ROLE_». Symfony 2 не любит роли без префикса. В документах «Все роли должны начинаться с префикса ROLE_, которым управляет Symfony2». http://symfony.com/doc/2.1/book/security.html Удачи и дайте мне знать, если это сработает. – JonnyS

+0

Это ничего не меняет –

Смежные вопросы