2016-04-21 2 views
1

В моем симфони проекте, используя связку ФОС, у меня есть 4 роли, как это:ФОС пользователя: разрешить маршрут ко многим ролям, даже если пользователь имеет только одну роли

  • ROLE_USER_ONE

  • ROLE_USER_TWO

  • ROLE_USER_THREE

Они не могут получить доступ к тому же просмотров, за исключением одного. Это мой контроллер для визуализации представления:

/** 
* @Security("has_role('ROLE_USER_ONE', 'ROLE_USER_TWO', 'ROLE_USER_THREE')") 
* @Route("/add-note", name="add_user_note") 
* @Method({"GET"}) 
*/ 
public function addNoteToUserAction() 
{ 
    $securityContext = $this->container->get('security.authorization_checker'); 

    if ($securityContext->isGranted('ROLE_USER_ONE', 'ROLE_USER_TWO', 'ROLE_USER_THREE')) { 
    /* ... some persist datas and process here ... */ 
    return $this->render('MyBundle:NoteUser:addNote.html.twig', array(
    )); 
    } else { 
     throw new \Exception('You have no right to access this page'); 
    } 
} 

Чтобы протестировать рендеринг вида, создать пользователя с ролью ROLE_USER_TWO. И когда я вынести мнение у меня есть эта ошибка:

Expression "has_role('ROLE_USER_ONE', 'ROLE_USER_TWO', 'ROLE_USER_THREE')" denied access.

Как я понимаю, Symfony ожидал пользователь имеет все роли, как я могу позволить доступ на просмотр пользователя Wich как у менее одной из этих ролей в моей аннотации контроллера и код контроллера?

+1

Я считаю, что вы делаете сейчас, чтобы заставить пользователя иметь ВСЕ эти роли. Попробуйте что-нибудь вроде (has_role ('ROLE_USER_ONE') или has_role ('ROLE_USER_TWO') или has_role ('ROLE_USER_THREE')) –

+1

if ($ securityContext-> isGranted ('ROLE_USER_ONE') || $ securityContext-> isGranted ('ROLE_USER_TWO') || $ securityContext-> isGranted ('ROLE_USER_THREE'), я думаю. Но, возможно, есть лучший способ – Letsrocks

+0

Кроме того, если вы используете @Security Annotation, вам не нужно повторять то же самое в функции –

ответ

3

Вместо того, чтобы пытаться поставить каждая роль в тот же has_role() заявление, вы должны объединить их с or так:

@Security("has_role('ROLE_USER_ONE') or has_role('ROLE_USER_TWO') or has_role('ROLE_USER_THREE')") 

Таким образом, вы фактически проверяете, что у текущего пользователя есть хотя бы одна из этих ролей, а не все из них.

0

Предполагаю, что вы ищете role hierarchy. Ваша конфигурация будет как:

security: 
    # ... 

    role_hierarchy: 
     ROLE_USER_ONE : ROLE_USER_BASE 
     ROLE_USER_TWO : ROLE_USER_BASE 
     ROLE_USER_THREE : ROLE_USER_BASE 

Таким образом, пользователи с ROLE_USER_ONE роль имеет также роль ROLE_USER_BASE и т.д. Затем, в контроллере нужно просто проверить только ROLE_USER_BASE:

/** 
* @Security("has_role('ROLE_USER_BASE')") 
* @Route("/add-note", name="add_user_note") 
* @Method({"GET"}) 
*/ 
public function addNoteToUserAction()