2016-04-04 21 views
0

私のプロジェクトは完全にプライベートなインターフェイスで、ユーザはログインするためにサインインする必要があります。私はログインフォームを作成しようとしています。だから、私は/ admin /フォルダが私のアーキテクチャでは必要ありません。Symfony3ログインフォーム:security.ymlのファイアウォールのパラメータ設定方法

私は従来のログインフォームを構築するためにSymfony instructionsに従った。

ホームページ(または別のもの)を取得しようとすると、ログインフォームにリダイレクトされます。この時点で、すべては大丈夫です。

しかし、私の問題は、ログインページにリダイレクトループがあることです。サインインしようとすると、私たちが見たいページの代わりにログインページに毎回リダイレクトされます。

私のsecurity.ymlファイルには、ファイアウォール設定のレベルに問題があると思います。

のsecurity.yml

まず、私は、少なくとも、私はデータベースに保存されているユーザーを取得します、シングルでシンプルなユーザーと私のログインフォームをテストしたいけど。それはテストのためのものです。

セキュリティで保護された領域は、ログインページ以外のすべてのインターフェイスです。そのため、ログインファイアウォール(正確にはSymfony recommends it)を実行しました。

security: 
    providers: 
     in_memory: 
      memory: 
       users: 
        mylogin: 
        password: mypwd 
        roles: 'ROLE_ADMIN' 

    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 

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

     login_firewall: 
      pattern: ^/login$ 
      anonymous: ~ 

     secured_area: 
      pattern: ^/ 
      provider: in_memory 
      form_login: 
       login_path: login 
       check_path: login 

       # csrf token options 
       csrf_parameter:  _csrf_token 
       csrf_token_id:  authenticate 
       csrf_token_generator: security.csrf.token_manager 

      logout: 
       path: /logout 
       target:/

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

ページのアーキテクチャ:

  • /default/index.html.twig
  • /security/login.html.twig

のrouting.yml

login: 
    path: /login 
    defaults: { _controller: AppBundle:Security:login } 

logout: 
    path: /logout 

SecurityController.php私は間違っ

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class SecurityController extends Controller 
{ 
    /** 
    * @Route("/login", name="login") 
    */ 
    public function loginAction(Request $request) 
    { 

     $authenticationUtils = $this->get('security.authentication_utils'); 

     // get the login error if there is one 
     $error = $authenticationUtils->getLastAuthenticationError(); 

     // last username entered by the user 
     $lastUsername = $authenticationUtils->getLastUsername(); 

     return $this->render(
     'security/login.html.twig', 
     array(
      'last_username' => $lastUsername, 
      'error'   => $error, 
     ) 
    ); 
    } 
} 

?なぜ私は自分のフォームにリダイレクトループがあるのか​​分かりません。私は偽のログイン名とパスワードを入れると また、symfonyはそれが何をすべきとのエラーが表示されない:

login.html.twig私はアドバイスを必要とする

{% if error %} 
    <p class="bg-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</p> 
{% endif %} 

は、私を助けてください;-) ありがとう!

答えて

0

を変更する必要があります私は、this threadのおかげで私の作品解決策を見つけました。私がホームページにアクセスしようとすると、それは私のログインフォームにリダイレクトし、今

...我々はそれが民間たい場合でも、メインのファイアウォールの内側:

不思議、我々は「〜匿名」配置する必要があります。サインインすると、ユーザーは認証され、ホームページにリダイレクトされます。

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

     main: 
      pattern: ^/ 
      provider: in_memory 
      anonymous: ~ 
      form_login: 
       login_path: /login 
       check_path: /login 

       # csrf token options 
       csrf_parameter:  _csrf_token 
       csrf_token_id:  authenticate 
       csrf_token_generator: security.csrf.token_manager 

      logout: 
       path: /logout 
       target:/

    access_control: 
     - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/, roles: ROLE_ADMIN } 
+0

私は同じ問題を抱えています。あなたのソリューションでは、フォームを送信するときにエラーが発生します。無効なCSRFトークン。私は本当にundestand問題は何ですか! – Sam

+0

ログインフォームにCSRFフィールドを追加しましたか?これを読んでください:http://symfony.com/doc/current/security/csrf_in_login_form.html – Felurian

0

こんにちは@Felurianあなたのcheck_pathはファイアウォールの内側にある必要があります。お使いのファイアウォールの

あなたは

main: 
     pattern: ^/ 
     anonymous: false 


      form_login: 
      login_path: /login 
      check_path: /login_check 

access_control: 
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
+0

解決方法を試しましたが、問題は解決しません。 "secured_area"の代わりに "login_firewall"を削除してコードを置く必要がありますか? – Felurian

関連する問題