2016-12-21 3 views
0

Я использую FOSOAuthBundle для моего REST приложенияSymfony безопасности FOSOAuthServerBundle государственные и частные маршруты

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

У меня есть следующий в моем security.yml:

security: 
encoders: 
    FOS\UserBundle\Model\UserInterface: bcrypt 

role_hierarchy: 
    ROLE_ADMIN:  ROLE_USER 
    ROLE_SUPER_ADMIN: ROLE_ADMIN 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username 

firewalls: 
    oauth_token: 
     pattern: ^/login 
     security: false 

    api: 
     pattern: ^/ 
     fos_oauth: true 
     stateless: true 
     anonymous: false 

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] } 

Например:

у меня есть продукты Entity и Controller

Я хотел бы, CRUD операции быть частным для Read

Так, кроме: POST, PUT, DELETE on /products(/:id) должна быть частной, в то время как GET должны быть публичными.

Я попытался добавить следующее к access_control:

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/products$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] } 

Я думал, что это откроет все methods на /products, но я получаю сообщение об ошибке:

{ 
    "error": "access_denied", 
    "error_description": "OAuth2 authentication required" 
} 

У меня есть много entities и controllers Я пытаюсь применить это.

Как я могу открыть определенные маршруты (включая требования method)?

ответ

0

Вы можете сделать новый брандмауэр с регулярным выражением и установить его как это. Вы должны поставить его перед вашим брандмауэром api, чтобы соответствовать этому регулярному выражению.

api_anonym_area: 
     pattern: (^/api/products/.*) 
     methods: [GET] 
     security: false 

Или вы можете сделать это

api_anonym_area: 
     pattern: (^/api/products/.*) 
     methods: [GET] 
     anonymous: true 

с

access_control: 
- { path: ^/api/products/.*, role: IS_AUTHENTICATED_ANONYMOUSLY} 

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

0

Чтобы достичь этого, лучшим способом было бы кодирование разрешений в контроллерах, я не думаю, что это возможно с помощью конфигурации security.yml.

Вы должны удалить:

- { path: ^/, roles: [ IS_AUTHENTICATED_FULLY ] } 

И управлять разрешениями внутри действия контроллера, например (из симфони документации на http://symfony.com/doc/current/security.html)

public function updateProduct($id) 
{ 
    // 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!'); 
    // } 

    // ... 
} 
+0

Вы также можете использовать аннотации для достижения этого, если хотите. '* @Secure (role =" ROLE_ADMIN ")' – JezEmery

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

  • Нет связанных вопросов^_^