Symfony安全:使用会话或oauth进行身份验证


Symfony Security: Auth with session or oauth

我已经开发了一个REST API,有两种方法可以连接到它:会话和oauth。基本上,我的网站将使用会话模式,第三方软件将使用oauth模式。

我设法使会话和oauth模式都能在symfony中工作,但我不能使它们同时工作。

这是我的防火墙安全配置:

firewalls:
    auth_oauth_token:
        pattern:    ^/auth/oauth/v2/token
        security:   false
    api:
        pattern:    ^/api
        anonymous:  false
        fos_oauth:  true
        stateless:  true
    auth:
        pattern:    ^/
        anonymous: ~
        form_login:
            login_path: /auth/session/check
            check_path: /auth/session/login
            always_use_default_target_path: true
            default_target_path: /auth/session/check
            failure_path: /auth/session/check
            failure_forward: false
            use_forward: false
            failure_forward: false
            username_parameter: username
            password_parameter: password
            post_only: true
            remember_me: false
            require_previous_session: false
        logout:
            path: /auth/session/logout
            target: /auth/session/logged_out
            invalidate_session: false

会话处理:/auth/Session。OAuth处理:/auth/OAuth。Api:/Api。

因此,有了这个配置,首先使用"api"防火墙,我可以使用令牌登录。但是,即使使用会话登录,如果我不指定令牌,我也无法访问。

首先使用"auth"防火墙,我可以使用会话表单登录。但是,即使我指定了一个令牌,我也无法访问。

我被这个弄疯了。我在堆栈溢出上发现了一些关于链提供商的东西,我可能需要像"链防火墙"这样的东西。。。如果被禁止,请检查另一个防火墙。

感谢

我通过复制api控制器的路由来解决,这样我就有了一个依赖OAuth2的路由/api/method和一个依赖标准(主)防火墙的/webapi/method路由:

在安全方面。yml:

firewalls:
    api:
        pattern:    ^/api
        fos_oauth:  true
        stateless:  true
    oauth_token:
        pattern:    ^/oauth/v2/token
        security:   false
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            login_path: /login
            check_path: /login_check
        logout:       true
        anonymous:    true
access_control:        
    - { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }
    - { path: ^/web-api, roles: [ IS_AUTHENTICATED_FULLY ] }

在路由中。yml:

acme_api:
    type: rest 
    prefix: /
    resource: "@AcmeBundle/Resources/config/routing_api.yml"

在routing_api.yml:中

# REST API - OAUTH Access
acme_api_users:
    resource: AcmeBundle'Controller'UsersController
    type:     rest
    defaults: {_format: json}
    prefix:   /api
    name_prefix:  api_
# REST API - Frontend Client Access 
acme_webapi_users:
    resource: AcmeBundle'Controller'UsersController
    type:     rest
    defaults: {_format: json}
    prefix:   /web-api
    name_prefix:  webapi_