2012-09-06 9 views
5

管理者と標準のユーザがそれぞれのセキュリティプロバイダによって処理されるシステムがあります。管理者は、メインサイトにもサインインしていない限り、メインサイトのファイアウォールの背後にあるファイルやイメージにアクセスできないため、管理ページに問題が発生しています。symfony 2:2つの別々のプロバイダを持つファイアウォールされたルートへのアクセス

プロバイダに関係なく、すべての認証済みのユーザーと管理者が画像とファイルにアクセスできる必要があります。それらはより細かいアクセス制御を提供するコントローラを通じて提供されます。

複数のプロバイダを定義してルートへのアクセスを許可することはできますか?

は、ここに私たちの現在のsecurity.ymlのストリップダウンバージョンです:

security: 
    providers: 
     admin_user_db: 
      entity: { class: OurAdminUserBundle:AdminUser, property: username } 
     site_user_db: 
      entity: { class: OurSiteUserBundle:SiteUser, property: username } 
    firewalls: 
     admin_login: 
      pattern: ^/admin/login$ 
      security: false 
     site_user_login: 
      pattern: ^/login 
      security: false 
     file_route: 
      pattern: ^/file 
      anonymous: ~ 
      ### We need to allow this route only for authorized users from 
      ### either admin_user_db or site_user_db providers 
     admin_secured_area: 
      pattern: ^/admin 
      http_basic: ~ 
      provider: admin_user_db 
      form_login: 
       check_path: /admin/login_check 
       login_path: /admin/login 
      logout: 
       path: /admin/logout 
       target:/
     site_secured_area: 
      pattern: .* 
      http_basic: ~ 
      provider: site_user_db 
      form_login: 
       check_path: /check_login 
       login_path: /login 
       failure_path: /login 
       failure_forward: false 
      logout: 
       path: /logout 
       target:/

答えて

5

私はあなたが探しているものを推測するには、ChainProviderです。このプロバイダは、現在の2つのプロバイダを順次使用するように設定されます。

チェーンプロバイダは、最初に設定された最初のプロバイダでユーザーを認証しようとします。成功した場合、ユーザーは認証されます。それが失敗した場合、チェーンプロバイダーは、それ以上のプロバイダーが試されなくなるまで、次のサービスを試します。

このテクニックは、ユーザーがフォームのログインまたはFacebookのログインで認証できるようにするために使用しました。私は2つのプロバイダを持っていました.1つはFacebook向け、もう1つはフォーム用でした。その後、私のファイアウォールでは、プロバイダーがチェーンプロバイダーであり、ユーザーは資格情報またはFacebookアカウントでログインすることができました。

チェーンプロバイダはシーケンシャルなので、私が提案するものは、おそらく最も頻繁に使用されるプロバイダを置くことです。ここで

symfonyのドキュメントサイトから取得した設定サンプル:あなたがここにdocumenationを見てとることができ

security: 
    providers: 
     chain_provider: 
      chain: 
       providers: [in_memory, user_db] 
     in_memory: 
      users: 
       foo: { password: test } 
     user_db: 
      entity: { class: Acme\UserBundle\Entity\User, property: username 

  1. Using Multiple User Providers

よろしく、 マット

+0

答えをいただきありがとうございます。これらの手順で(私は構文が少し違っていたとは思いますが)、 "ChainProvider" Symfonyのバージョン)。最終的に私たちはシナリオでは別のプロバイダが本当に必要ではないことに気づいたので、@ AdminVserのような代わりに 'AdminUser'を削除し、ロールを使用することになりました。 – Kaivosukeltaja

1

私はこの問題に関していくつかの経験を持っており、解決策はMattと書いてありました。

しかし、アウトプットアプリケーションには管理、生徒、教師のファイアウォールがあるため、必要なときに偽装を成功させることができませんでした。つまり、管理者のユーザーは、ファイアウォールとその唯一のユーザーからのユーザーを偽装する可能性があります。

今、私が何か間違ったことをしたが、これは、時間に敏感な仕事だったので、我々は1つのファイアウォールの背後にあるすべてのものを置くと異なる役割が仕事をやらせることを決めたということも可能です。これははるかに単純な解決策であることが判明しましたが、最終的にはあなた次第です...

関連する問題