【问题标题】:Symfony Security: Auth with session or oauthSymfony 安全性:使用 session 或 oauth 进行身份验证
【发布时间】:2013-12-04 14:24:58
【问题描述】:

我开发了一个 REST API,有两种连接方式:session 和 oauth。 基本上我的网站会使用session模式,第三方软件会使用oauth模式。

我设法让 session 和 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”防火墙,我可以使用会话表单登录。 但即使我指定了令牌,我也无权访问。

我快被这个弄疯了。我在堆栈溢出中发现了有关链提供商的信息,我可能需要“链防火墙”之类的东西...如果被禁止,请检查另一个防火墙。

谢谢

【问题讨论】:

    标签: php symfony-2.3 fosoauthserverbundle


    【解决方案1】:

    我通过复制 api 控制器的路由解决了问题,因此我有一个依赖于 OAuth2 的路由 /api/method 和一个依赖于标准(主)防火墙的 /webapi/method 路由:

    在security.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 ] }
    

    在routing.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_
    

    【讨论】:

    • 有了这个建议,secong /web-api 配置会覆盖 /api 配置,FOSRestBundle 仅为 /web-api 构建路由。你确定这是一个可行的解决方案吗? @fdellutri
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多