2016-04-11 7 views
1

アプリケーションには、クライアント用と管理者用の2つのログインフォームがあります。異なるログインフォームに同じプロバイダを使用

2つの形式が同じプロバイダを使用します。

security: 
    providers: 
     form_login: 
      entity: { class: FMP\SecurityBundle\Entity\User, property: username } 

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    app_secured_area: 
     pattern: ^/ 
     anonymous: ~ 
     form_login: 
      provider: form_login 
      login_path: security_app_login 
      check_path: security_app_login_check 
      default_target_path:/
     logout: 
      path: security_logout 
      target: security_app_login 

    admin_secured_area: 
      pattern: ^/admin 
      anonymous: ~ 
      form_login: 
       provider: form_login 
       login_path: security_admin_login 
       check_path: security_admin_login_check 
       default_target_path: /admin/ 
      logout: 
       path: security_logout 
       target: security_admin_login 

    default: 
     anonymous: ~ 
     http_basic: ~ 

はDefaultController.php:私はルート/admin/loginにアクセスし、私にログインすると

class DefaultController extends Controller 
{ 
    /** 
    * @Route("/login", name="security_app_login") 
    * @param Request $request 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function appLoginAction(Request $request) 
    { 
     return $this->loginAction($request, 'FMPSecurityBundle:Default:app_login.html.twig'); 
    } 

    /** 
     * @Route("/admin/login", name="security_admin_login") 
     * @param Request $request 
     * @return \Symfony\Component\HttpFoundation\Response 
     */ 
     public function adminLoginAction(Request $request) 
     { 
      return $this->loginAction($request, 'FMPSecurityBundle:Default:admin_login.html.twig'); 
     } 

     public function loginAction(Request $request, $template) 
     { 
      $session = $request->getSession(); 

      if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { 
       $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR); 
      } else { 
       $error = $session->get(SecurityContext::AUTHENTICATION_ERROR); 
      } 

      return $this->render($template, array(
       'last_username' => $session->get(SecurityContext::LAST_USERNAME), 
       'error'   => $error, 
     )); 
     } 

     /** 
     * @Route("/login_check", name="security_app_login_check") 
     */ 
     public function loginCheckAppAction() 
     { 
      // 
     } 

     /** 
     * @Route("/admin/login_check", name="security_admin_login_check") 
     */ 
     public function loginCheckAdminAction() 
     { 
      // 
     } 

     /** 
     * @Route("/logout", name="security_logout") 
     */ 
     public function logoutAction() 
     { 
      // 
     } 
} 

、次のエラーが返されます。

コントローラーはレスポンス(nullが指定されている)を返す必要があります。あなたはあなたのコントローラのどこかにreturnステートメントを追加することを忘れましたか?

どうしたのですか?別のフォームに同じプロバイダを使用することはできませんか?

+0

それの作品を発射しますか? –

+0

@FrançoisDupontはい。クライアント(/ login)では動作しますが、管理者(/ admin/login)では動作しません。 – Filipe

+0

このメソッドにlogin.checkAdminAction()を入力した場合のようですが、アクセスできるかどうかを確認するsymfonyセキュリティシステムには入力していません。 security_app_login_checkと同じcheck_pathを使用してください。 –

答えて

1

ファイアウォールの設定を入れ替えてみてください。あなたの構成では

admin_secured_area: 
     pattern: ^/admin 
     anonymous: ~ 
     form_login: 
      provider: form_login 
      login_path: security_admin_login 
      check_path: security_admin_login_check 
      default_target_path: /admin/ 
     logout: 
      path: security_logout 
      target: security_admin_login 

app_secured_area: 
    pattern: ^/ 
    anonymous: ~ 
    form_login: 
     provider: form_login 
     login_path: security_app_login 
     check_path: security_app_login_check 
     default_target_path:/
    logout: 
     path: security_logout 
     target: security_app_login 

は、常にapp_secured_area、決してadmin_secured_areaクライアント用

+0

それは働いた!私は理解していない、今両方のフォームを動作させます。どうして? – Filipe

+1

app_secured_areaは、パターン^ /がすべてのリクエストに一致するために発生します。したがって、新しい火災のadmin_secured_area –

1

は、セキュリティシステムを取得し、あなたの管理者のログイン

EDITのリダイレクトを処理するために、これを追加するにはパスが1つだけであるため、その後のクライアントよりチェックをログインすると同じパスを保つそれはfailure_path気の毒だ

admin_secured_area: 
     pattern: ^/admin 
     anonymous: ~ 
     form_login: 
      provider: form_login 
      login_path: security_admin_login 
      check_path: security_app_login_check 
      failure_path: security_admin_login <----- ADD THIS LINE 
      default_target_path: /admin/ 
     logout: 
      path: security_logout 
      target: security_admin_login 
+0

[symfony \ Component \ Config \ Definition \ Exception \ InvalidConfigurationException] "security.firewalls.admin_secured_area.form_login"の下に "access.deny_url"という認識されないオプションがあります – Filipe

+0

これは私の誤りです、私の編集を見てください –

+0

これは動作しません、管理者は引き続きリダイレクトされます「不正な資格情報」エラーが発生したときにクライアントのログインページに移動します。 – Filipe

関連する問題