2013-12-04 3 views
3

Я разработал API REST, есть два способа подключения к нему: session и oauth. В основном, мой сайт будет использовать режим сеанса, а стороннее программное обеспечение будет использовать режим oauth.Symfony Security: Auth с сеансом или 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 

обработка Сессия:/авториз/сеанс. Управление OAuth:/auth/oauth. Api:/api.

Итак, с этой конфигурацией, с первым брандмауэром «api», я могу войти в систему с помощью токена. Но даже вошел в систему с сеансом, если я не укажу токен, у меня не будет доступа.

С первым брандмауэром «auth» я могу войти в систему с формой сеанса. Но даже если я укажу токен, у меня не будет доступа.

Я с ума схожу с этим. Я обнаружил, что при переполнении стека что-то о поставщиках цепочек, мне, вероятно, понадобится нечто вроде «брандмауэра цепи» ... если это запрещено, проверьте другой брандмауэр.

Спасибо

ответ

2

Я решил, дублируя маршруты контроллеров API, так что у меня есть маршрут /api/method опирающихся на OAuth2 и /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_ 
+1

С этим внушения secong/веб-апи configturation перекрывает конфигурацию/API и FOSRestBundle строит маршруты для/только веб-API. Вы уверены, что это рабочее решение? @fdellutri –

+0

@borN_free Я сделал некоторые изменения, попробуйте теперь с новым кодом – fdellutri

+1

он работает! Этот ответ должен быть принят, потрясающий –