0

我正在为我的 REST 应用程序使用 FOSOAuthBundle

我希望我的大多数路线都需要授权,但是有一些路线应该可以公开访问

我的 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 ] }

例如:

我有一个产品EntityController

我希望这些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"
} 

我有很多entitiescontrollers我正在尝试将其应用于。

我将如何打开特定路线(包括method要求)?

4

2 回答 2

0

为了实现这一点,最好的方法是在控制器中编写权限,我认为这不可能通过 security.yml 配置实现。

您应该删除:

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

并管理控制器操作中的权限,例如(取自http://symfony.com/doc/current/security.html上的 symfony 文档)

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!');
    // }

    // ...
}
于 2016-12-21T08:08:32.953 回答
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}

在第一种情况下,您将没有令牌,在第二种情况下,您将拥有令牌(当您期望经过身份验证或匿名的用户来时,这很好)。

于 2017-03-01T08:51:05.977 回答