2016-02-23 5 views
5

安全なルートがある場合は、panelのように、Symfonyはログインしているユーザーのみにアクセスを許可します。それにはログインしていないユーザーのためにsymfonyのセキュリティのログインページへのリダイレクト

- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/panel, role: ROLE_USER } 

常に(私はFOSUserBundleを使用しています)login_pathにリダイレクトされます:

私は無効にするか、このリダイレクトを無効にすることができます
security: 
    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       login_path:  fos_user_security_login 

?私は、ユーザーをリダイレクトすることなく、直接ログインフォームを表示したい。

AccessDeniedHandlerInterfaceと関係がありますが、security.ymlでどのような鍵を上書きする必要がありますか?そして、デフォルトの実装はどこですか?

その他の状況では、DefaultLogoutSuccessHandler, DefaultAuthenticationFailureHandler, DefaultAuthenticationSuccessHandlerがあり、これらの状況ごとにサービスを実装することができます。それぞれのインターフェイスが拡張され、状況に応じてカスタム処理が可能です。しかし、AccessDeniedには何も見つかりません。 Its directoryにはインターフェイスのみが含まれています。

+2

どのような利点がありますか?ログインした後、ユーザーは/ panelにリダイレクトされ、何の違いも感じられません。何が欠けていますか? – ccKep

+0

いくつかのルートにログインページを追加したいと思います。ユーザーはそのページにアクセスしたいがログインしていないので、ログインフォームを表示し、ログイン後(ajaxで)彼はパネルにリダイレクトされる。 –

+0

にログインフォームを表示するには、匿名アクセスを許可する必要があります。コントローラの許可を確認してください(例: – Heah

答えて

3

私はこれを手動で行います。

匿名によってあなたのルートにアクセスできるようにします:

テンプレートで
- { path: ^/panel, role: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_USER] } 

、ログインしているユーザがいるかどうかを確認:

{% if app.user is null %} 
    <!-- Then display your login form --> 
{% else %} 
    <!-- Display the normal view --> 
{% endif %} 

またはコントローラからそれを実行します。

if (!is_object($this->get('security.token_storage')->getToken()->getUser())) { 
    // Render the login form 
} 

このように、ユーザーが認証されているかどうかに応じてロジックを作成できます。

+0

ユーザーがパネルページにアクセスしたいと思って、ログインフォームを表示しているページ(リダイレクトされ、ajaxで有効性が確認されているページ)にリダイレクトされた場合、ログイン後にリダイレクトするページ(この場合はページ)ユーザーが最初にログインしたいかどうかを知るには(ログインフォームはモーダルで、コンテンツはajaxで取得されます) –

+0

あなたの質問には、ユーザーをリダイレクトしたくないと言っているだけで、ログインフォームだけが表示されます。あなたのユーザがアクセスしようとしているページを知るには、twigから 'app.request.headers.get( 'referer')'を使うか、コントローラから '$ this-> getRequest() - > headers-> get( 'referer')' 。次に、ログイン後にrefererにリダイレクトする場合は、 '_target_path'をフォームフィールドとして追加し、それをリファラに記入し、フォームを扱うメソッドでリダイレクトを行います(フォームがFOSUserによって処理される場合、' _target_path 'が自動的に使用されます)。私はあなたが例を必要とする場合、簡単に編集することができます。 – chalasr

+0

いい考えです。 –

関連する問題