2016-01-13 10 views
5

Mam podstawowe API, które uwierzytelnia użytkowników za pomocą FOSOAuthServerBundle. Użytkownicy mogą mieć role ROLE_USER i ROLE_ADMIN. Bazując na dokumentach FOSOAuthServerBundle, domyślnym zachowaniem jest używanie zakresów jako ról, więc pomyślałem, że gdy mam zwykłego użytkownika, pakiet zwróci scope: user w odpowiedzi, a gdy jest to użytkownik admin, zwróci scope: admin. Ale tak nie działa. Pakiet zwraca wszystko, co jest skonfigurowane w pozycji supported_scopes. Poniżej znajduje się mój config.yml.Jak radzić sobie z zakresami ROLES i FOSOAuthServerBundle

fos_oauth_server: 
    service: 
     options: 
      supported_scopes: user admin 

Moja access_control sekcja w security.yml jest pusta, a moja sekcja firewalls jest poniżej:

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 

ten sposób wiązka zawsze powrócić user admin w zakresie, nawet jeśli użytkownik nie posiada rolę ROLE_ADMIN.

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

Czego mi brakuje? Czy rola użytkownika nie jest powiązana z zakresem tokenu? Czy istnieje lepszy sposób sprawdzenia, czy mój użytkownik jest administratorem czy nie?

+0

Może to nie jest twój 'security.yml' i jest wklej z' config.yml'? Czy mógłbyś podać sekcję 'access_control:' z 'security.yml'? –

+0

Masz rację Illya. Edytuję moje pytanie. –

Odpowiedz

2

Z domyślnego zachowania doc należy mapować zakresy wraz z rolami. W twoim przypadku role będą ROLE_USER i ROLE_ADMIN.

teraz, aby ograniczyć zużycie, można edytować plik security.yml trochę tak:

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

Aby ograniczyć dostęp do wnętrza sterownika, można użyć to:

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

ponownie z doc,

Teraz klienci będą mogli przekazać parametr zakresu na żądanie token dostępu.

Mam nadzieję, że to pomoże.

UPDATE:

Spójrz na to odpowiedź here z podobnym pytaniem i to article na utworzenie FOSOAuthServerBundle. Zwróć szczególną uwagę na część konfiguracyjną.

+0

Ale jak mogę sprawdzić w moim interfejsie, czy mój użytkownik jest administratorem czy nie? –

+0

W szablonie Twig można to zrobić: '{% if is_granted ('ROLE_ADMIN')%} {# Some text #} {% endif%}' Lub zaimplementuj metodę isGranted w jednostce User (http://stackoverflow.com/questions/9080530/get-role-of-a-user-not-logged-in-twig-symfony2) – Delphine

+0

Delphine, nie zrozumiałeś mojego punktu widzenia. Używam REST Api i żądam danych z mojego interfejsu javascript. Muszę wykonać żądanie API, a następnie uzyskać, jaka jest moja rola użytkownika. Te dane nie są wysyłane, gdy wysyłam żądanie/ja. Kiedy żądamy tokena API, powrót (jak wspomniano powyżej) ma parametr "zasięgu". Ale nie wiem, czy to jest właściwa droga i wygląda na to, że nie działa. –

1

FOSOAuthServerBundle uwierzytelnia użytkownika na podstawie tokena, więc nie musisz się martwić o zakresy, to jest coś innego niż role. Wewnątrz kontrolera można uzyskać $this->getUser(), aby uzyskać aktualnego uwierzytelnionego użytkownika. Jeśli to działa, sprawdź, czy działa również 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!'); 
    // } 

    // ... 
} 

W przypadku $this->getUser() robi praca będzie trzeba ustawić fetch do EAGER o podmiocie 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

Nie zrozumiałeś mojego punktu. Potrzebuję sposobu, aby dowiedzieć się, jaka jest rola użytkownika w moim interfejsie. Tak więc, kiedy zażądam tokena, muszę wiedzieć również, w których rolach użytkownik został przyznany. Mamy już parametr "zasięg" w tokenie, ale wygląda na to, że nie działa zgodnie z oczekiwaniami (podałem przykład powyżej). –

+0

Nie możesz po prostu pobrać bieżących danych użytkownika z interfejsu API? – Vardius

+0

Nie ... podczas żądania informacji użytkownika FOSOAuthServerBundle nie zwraca zasięgów ani reguł. Jeśli zwrócisz uwagę na moje pytanie, zobaczysz, że żądanie tokena daje ci zasięg, ale nie działa, jak się spodziewano. –

Powiązane problemy