2016-01-13 5 views
5

У меня есть базовый api, который проверяет подлинность пользователей с помощью FOSOAuthServerBundle. Пользователи могут иметь роли ROLE_USER и ROLE_ADMIN. Основываясь на документах FOSOAuthServerBundle, поведение по умолчанию заключается в использовании областей в качестве ролей, поэтому я подумал, что когда у меня есть обычный пользователь, этот пакет вернет scope: user в ответ, а когда он станет пользователем администратора, вернется scope: admin. Но это не так. Пакет возвращает все, что настроено в записи supported_scopes. Ниже мой config.yml.Как справиться с областями ROLES и FOSOAuthServerBundle

fos_oauth_server: 
    service: 
     options: 
      supported_scopes: user admin 

Мой access_control раздел в security.yml пуст, и мой firewalls раздел ниже:

firewalls: 
     users_create: 
      pattern: ^/v1/users 
      methods: [POST] 
      security: false 

     api: 
      pattern: ^/ 
      security: true 
      fos_oauth: true 
      stateless: true 

access_control: 
     # You can omit this if /api can be accessed both authenticated and anonymously 

Таким образом, расслоение всегда возвращают user admin в области видимости, даже если пользователь не имеет роли ROLE_ADMIN.

{ 
"access_token": "ZGQ2ODE5ZjAzNTZkOWY0OWMyNmZmODE4MjcwZTJmYjExNzY0NzQxOTRmMzk4NzA2Mjc2NjIyZmY1ZDgwMzk4NA" 
"expires_in": 3600 
"token_type": "bearer" 
"scope": "user admin" 
"refresh_token": "NmM5ZGFmNzBiNTNjYmQzMTQ1MTk0ODJjOTAxMWU0YWIwMzM1MzgyODg4ZTAzNTI5ZTk2MDc3OGU2MTg0MWZiMA" 
} 

Что мне счесть? Разве пользовательская роль не связана с областью токена? Есть ли лучший способ узнать, является ли мой пользователь администратором или нет?

+0

Возможно, это не ваш 'security.yml', и это вставка из' config.yml'? Не могли бы вы предоставить раздел 'access_control:' из 'security.yml'? –

+0

Ты прав Илья. Редактирование моего вопроса. –

ответ

2

От doc поведение по умолчанию - это сопоставление областей с ролями. В вашем случае роли будут ROLE_USER и ROLE_ADMIN.

Теперь ограничить использование, вы бы изменить security.yml файл примерно так:

# app/config/security.yml 
security: 
    access_control: 
     - { path: ^/api/super/secured, role: ROLE_ADMIN } 
     - { path: ^/api/general, role: ROLE_USER } 

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

if ($this->get('security.context')->isGranted('ROLE_ADMIN')) { 
    // the user has the ROLE_ADMIN role, so act accordingly 
} 

Опять из doc,

Теперь клиенты смогут передать параметр области при запросе - токен доступа.

Надеюсь, это поможет.

UPDATE:

Посмотрите на этот ответ here на подобный вопрос, и это article по настройке FOSOAuthServerBundle. Обратите особое внимание на часть конфигурации.

+0

Но как я могу узнать в моем интерфейсе, если мой пользователь является администратором или нет? –

+0

В шаблоне Twig вы можете сделать это: '{%, если is_granted ('ROLE_ADMIN')%} {# Некоторый текст #} {% ENDIF%}' Или реализовать метод isGranted в вашем пользователя организации (HTTP://stackoverflow.com/questions/9080530/get-role-of-a-user-not-logged-in-twig-symfony2) – Delphine

+0

Дельфина, вы не поняли. Я использую REST Api и запрашиваю данные из моего интерфейса javascript. Мне нужно сделать запрос API, а затем получить роль пользователя. Эти данные не поступают, когда я делаю/меня запрашиваю. Когда мы запрашиваем токен API, возврат (как упоминалось выше) имеет параметр «scope». Но я не знаю, правильно ли это, и похоже, что он не работает. –

1

FOSOAuthServerBundle аутентифицировать пользователя на основе токена, так что вам не нужно беспокоиться о облаках, иначе это роли. Внутри вашего контроллера вы можете получить $this->getUser(), чтобы получить текущий аутентифицированный пользователь. Если это работает, проверьте, работает ли также isGranted.

http://symfony.com/doc/current/book/security.html

public function helloAction($name) 
{ 
    // The second parameter is used to specify on what object the role is tested. 
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 

    // Old way : 
    // if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { 
    //  throw $this->createAccessDeniedException('Unable to access this page!'); 
    // } 

    // ... 
} 

В случае $this->getUser() не работает, вам придется установить fetch в EAGER на AccessToken лица.

class AccessToken extends BaseAccessToken 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Client") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    protected $client; 

    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", fetch="EAGER") 
    */ 
    protected $user; 
} 
+0

Вы не поняли. Мне нужен способ узнать, какова роль пользователя в моем интерфейсе. Поэтому, когда я запрашиваю токен, мне также нужно знать, в каких ролях пользователь был предоставлен. У нас уже есть параметр «scope» в токене, но похоже, что он не работает должным образом (я привел пример выше). –

+0

Вы не можете просто получить текущие данные пользователя из api? – Vardius

+0

Нет ... когда вы запрашиваете данные пользователя FOSOAuthServerBundle не возвращает области или правила. Если вы обратите внимание на мой вопрос, вы увидите, что запрос/токен дает вам области, но он не работает ожидаемым. –

1

Существует проблема на GitHub, который относится back to 2013 for this.Если вы прочтете эту проблему и следуете ссылкам, вы в конечном итоге получите пользователя Spomky, создающего his own library and Symfony bundle и являющийся suggested as a maintainer из FOSAuthServerBundle. Похоже, что организация FOS объединит работу Spomky в следующую крупную версию FOSOAuthServerBundle, когда она будет стабильной.

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