Symfony Security FOSOAuthServerBundle公共和私人路由

时间:2016-12-21 07:58:26

标签: symfony fosoauthserverbundle

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

我希望我的大部分路线都需要授权,但有一些路线需要公开访问

我的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要求)?

2 个答案:

答案 0 :(得分: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!');
    // }

    // ...
}

答案 1 :(得分: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}

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