2017-04-09 4 views
0

私はsymfonyプロジェクトに取り組んでおり、私はこれを初めて知ったので、あなたが解決したいユーザの認証に質問があります。Symfony2異なるURLにアクセスするために2つの異なるユーザ名を持つユーザを認証する方法

私のプロジェクトは教師タイプのユーザーがusernamepasswordのデータベースを持つ学校についてのものです。ユーザー名は、tの後に個人識別番号(例えば、t48945110)が続きます。さらに、教師にはブール属性があり、どれが学校のプリンシパルであるかを示します(1つしかありません)。

次のように私のプロジェクトのセキュリティ設定は次のとおりです。以上により

Secutiry.yml

security: 

    firewalls: 

    intranet: 
     pattern: ^/ 
     anonymous: ~ 
     provider: teachers 
     form_login: 
      login_path: /login 
      check_path: /login_check 
      # use_referer: true 
      default_target_path: /teacher 
     logout: ~ 

    access_control: 
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: admin/, roles: ROLE_ADMIN } 
    - { path: /teacher, roles: ROLE_TEACHER } 

    providers: 
     teachers: 
     entity: { class: School\BackendBundle\Entity\Teacher, property: username} 

    encoders: 
     School\BackendBundle\Entity\Teacher: { algorithm: sha512 } 

、教師はログインフォームを通して彼のプライベートの部分にaccerderことができますが、問題私はディレクター(データベース内の属性(director=1)を持つ教師)にアクセスしたいときに持っています。この教師が別のユーザー名でアクセスできるようにしたいのですが、データベースに保存せず、メインレターを変更してから、認証の際に教師の通常のユーザー名を探し、ディレクターがそれをリダイレクトするかどうかを確認してください/teacherの代わりに/ admin例えば、ユーザ名t48945110で教師として自分の個人領域にアクセスし、ユーザ名d48945110で学校の管理領域にアクセスすることができる学校の長。

この考え方は、2つの異なるログインフォームを作成するのではなく、アプリケーションのすべてのユーザー(学生、教師、ディレクターなど)にアクセスすることです。

イベントリスナーなどで処理できるかどうかわかりません。私はあなたの助けに感謝します。

+0

これは私にとってはやや複雑です。ユーザー名には、特定のユーザーが持つ役割についての兆候があってはなりません。 admin /に1つの管理インターフェースを置いて、教師のためにACL経由でアクセス権を制限するのはなぜですか? – Atan

+0

こんにちは@Atan、返信いただきありがとうございます。この場合、管理者にアクセスするには、教師はプライベートエリアの前にアクセスし、そこから管理部分を開くオプションを追加する必要があります。それは私の主なアイデアでしたが、教師が2つの異なる形式を使わずにそれぞれの部分に個別にアクセスできる方法があればわかりませんでした。 – Joseph

+0

いいえ、私は、単一のログインフォームを使用して、すべてのユーザー(学生、教師、ディレクター)をadmin /にリダイレクトすることを意味しました。その後、ACLルールを使用して、役割に応じて管理パネル内のユーザーのアクセスを制限します。たとえば、ディレクターにはROLE_TEACHERとROLE_ADMINの2つの役割があります。教師にはROLE_TEACHERしかありません。 – Atan

答えて

1

私はあなたがものを過度に作成するかもしれないと思う。あなたのディレクターが別のセクションに入るために別のユーザー名でログインしたくないと確信しています。詳細を知らなくても、私が推薦することは、このような何かにあなたのSchool\BackendBundle\Entity\TeachergetRoles()を変更されています

public function getRoles() 
{ 
    $roles = array('ROLE_TEACHER'); 
    if ($this->director == 1) { 
     $roles[] = 'ROLE_DIRECTOR'; 
     $roles[] = 'ROLE_ADMIN'; 
    } 

    return $roles; 
} 

これはおそらく、ユーザは、教師が同様に彼らのセキュリティで保護された領域へのアクセスを持つことが、両方持っているための最も簡単な方法ですアカウントを切り替えることなく管理領域にアクセスできるディレクターとして

何らかの理由でこれが機能しない場合は、Security Votersをご覧ください。これは次のようになります。

これもまた、別のユーザーとしてログインする必要なく、ディレクターである教師のアクセスを許可します。この有権者は、デフォルトの投票者戦略を使用してdirector=1の先生にサイトのすべてのセクションへのアクセスを常に許可するため、この有権者には注意してください。これを変更する方法や、提供された属性と投票対象に基づいて小切手を追加する方法があります。

あなたのユースケースでは、最初のオプション(役割の更新)がおそらく最も簡単で、うまくいくと思います。

ログイン後に生徒、教師、ディレクターを別のページにリダイレクトしたい場合は、ちょっとしたことができます。あなたのSecurityController(またはあなたのloginActionを持っている場所)で、成功したログインの後にターゲットとして使用される新しいtargetAction()を作成してください。あなたのsecurity.ymlでは、/ teacherの代わりにそのルートにform_loginのdefault_target_pathを割り当てます。そのアクションは、3つのすべてのユーザーグループがアクセスできる必要があります。あなたのユーザーの役割に基づいてリダイレクトするだけです:

public function targetAAction() 
{ 
    $user = $this->getUser(); 
    if (in_array('ROLE_ADMIN', $user->getRoles())) { 
     return $this->redirectToRoute('intranet_admin_page'); 
    } 
    if (in_array('ROLE_TEACHER', $user->getRoles())) { 
     return $this->redirectToRoute('intranet_teacher_page'); 
    } 

    return $this->redirectToRoute('generic_page_for_users'); 
} 
関連する問題