0

私はsymfony2でログインフォームのダイアログを実装していますが、もう少しロジックでリターンを処理したい場合を除いてうまく機能します。ファイアウォール構成がログイン送信を取得するため、その方法がわかりません。

ログインに失敗した場合、ダイアログのhtmlがログインコントローラから返された新しいhtmlに置き換えられますが、これはすべて問題ありません。しかし、ログイン試行が成功すると、ログインダイアログのhtmlがサイト全体に置き換えられます(symfony2ログインが成功するとスタートページにリダイレクトされるため...)。

フラットPHPでは、これをログインコントローラーに追加します

if (login_successful) {
  return "success";
}

そして私のダイアログ関数に入れます

if (returned_data == "success") {
  refresh_page(); // or location.href('something')
}
else
{
  // replace dialog_html with the returned html
}

しかし、FOSユーザーバンドルでのログインフォームの送信を処理するアクションを見ると、これが私が見つけたものです

public function checkAction()
{
    throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');
}

だから私はこれがsymfony2の舞台裏ですべて処理されていることを理解しています、それでも私はこれを手に入れることができますか?

実際のサンプルコード(JS)..。

function submitFormWithAjax(form) {
  form = $(form);
  $.ajax({
    url: form.attr('action'),
    data: form.serialize(),
    type: (form.attr('method')),
    dataType: 'html',
    success: function(data) {
        if (data == 'success') {
            //Success-token is passed, so reload page (will close dialog and load the logged-in start screen since user is now fully authenticated
            location.reload();
        }
        else {
            //Form is returned, probably with errors, so let user try again...
            $('#formDialog').html(data);
        }
      }
  });
  return false;
} 

とフォーム...

<form action="{{ path("fos_user_security_check") }}" method="post" id="login-form">
    <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />

    <TABLE>
        <TR>
            <TD><label for="username">Login</label></TD>
            <TD><input type="text" placeholder="användare" id="username" name="_username" value="{{ last_username }}" /></TD>
        </TR>
        <TR>
            <TD><label for="password">Lösenord</label></TD>
            <TD><input type="password" placeholder="lösenord" id="password" name="_password" /></TD>
        </TR>
        <TR>
            <TD><label for="remember_me">Kom ihåg mig</label></TD>
            <TD><input type="checkbox" id="remember_me" name="_remember_me" value="on" /></TD>
        </TR>
        <!--
        <TR>
            <TD></TD>
            <TD align="right"><input type="submit" id="_submit" name="_submit" value="Logga in" /></TD>
        </TR>
        -->
    </TABLE>

</form>

以下のm2mdasの提案に従って、次のように設定しました。

config.yml

#My services
services:
    my.authentication.success_handler:
        class:     Hemekonomi\UserBundle\AuthenticationSuccessHandler
        parent:    security.authentication.success_handler  

私のuserbundleにはこのクラスがあります

<?php
namespace MyApp\UserBundle;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

class AuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler
{
   public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        if(true === $request->isXmlHttpRequest()) {
            return new Response("success");
        }

        //default redirect operation.
        return parent::onAuthenticationSuccess($request, $token);
    }

}

...そしてsecurity.ymlには...

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            success_handler: my.authentication.success_handler
        logout:       true
        anonymous:    true

私が得るエラーはこれです

RuntimeException: The parent definition "security.authentication.success_handler" defined for definition "my.authentication.success_handler" does not exist.

それはフォーマットと関係がありますか、それはxml / ymlで異なりますか?私も専門家ではないので...

4

2 に答える 2

1

ファイアウォール構成のオプションをsuccess_handler利用できます。failure_handler例えば

成功ハンドラークラス、

namespace Your\NameSpace;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

class AuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler
{
   public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        if(true === $request->isXmlHttpRequest()) {
            return new Response("success");
        }

        //default redirect operation.
        return parent::onAuthenticationSuccess($request, $token);
    }

}

障害ハンドラークラス、

namespace Your\NameSpace;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

class AuthenticationFailureHandler extends DefaultAuthenticationFailureHandler
{
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        if(true === $request->isXmlHttpRequest()) {
            return new Response("failure");
        }

        //default redirect operation.
        return parent::onAuthenticationFailure($request, $exception);

    }
}

サービス定義(xml)

    <service id="my.authentication.success_handler" class="Your\NameSpace\AuthenticationSuccessHandler" parent="security.authentication.success_handler"/>

    <service id="my.authentication.failure_handler" class="Your\NameSpace\AuthenticationFailureHandler" parent="security.authentication.failure_handler"/>

または、ymlサービス定義、

my.authentication.success_handler:
    class: Your\NameSpace\AuthenticationSuccessHandler
    parent: security.authentication.success_handler

my.authentication.failure_handler:
    class: Your\NameSpace\AuthenticationFailureHandler
    parent: security.authentication.failure_handler

そして最後にsecurity.yml

security:
    firewall:
        your_firewall:
            #...
            form_login:
                #...
                success_handler: my.authentication.success_handler
                failure_handler: my.authentication.failure_handler
于 2012-12-03T22:02:45.803 に答える
0

私はこのソリューションを使用することになりました(m2mdasとhttp://blog.alterphp.com/2011/10/set-up-authenticationsuccesshandler.htmlに感謝します)

config.yml

#My services
parameters:
    security.authentication.success_handler.class: MyApp\UserBundle\Resources\AuthenticationSuccessHandler

services:
    security.authentication.success_handler:
        class: %security.authentication.success_handler.class%
        public: false
        arguments:  ['@router', '@security.user.entity_manager']

security.wml

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            success_handler: security.authentication.success_handler
        logout:       true
        anonymous:    true

successhandler(私が要求したものよりわずかに多くの機能を含み、後でこれを使用する可能性があります):

<?php

namespace MyApp\UserBundle\Resources;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Doctrine\ORM\EntityManager;


/**
 * Custom authentication success handler
 */
class AuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface
{

   private $router;
   private $em;

   /**
    * Constructor
    * @param RouterInterface   $router
    * @param EntityManager     $em
    */
   public function __construct(RouterInterface $router, EntityManager $em)
   {
      $this->router = $router;
      $this->em = $em;
   }


   function onAuthenticationSuccess(Request $request, TokenInterface $token)
   {

        if(true === $request->isXmlHttpRequest()) {
            return new Response("success");
        }

        //default redirect operation.
        $uri = $this->router->generate('MyAppSkrivbordBundle_homepage');
        return new RedirectResponse($uri);


   }
}
于 2012-12-04T11:07:08.497 に答える