私は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で異なりますか?私も専門家ではないので...