Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to disable redirection after login_check in Symfony 2

Tags:

php

symfony

I need to disable redirection after login check, because I need to get only that the login was success or not. After submission /login_check url give me the right data, but keep redirecting to /login (on failure).
/login is blank after that.
I am trying to set up login form using extjs 4 so I need to validate trough an ajax post request. login_check should authenticate, create user session and return whether it was success or failure, but no forwarding anywhere.

my login.html.twig looks like:

{% if is_granted("IS_AUTHENTICATED_REMEMBERED") %}
    { success:true }
{% else %}
    { success: false }
{% endif %}

and in security.yml:

firewalls:
    main:
        form_login:
            provider: fos_userbundle
            failure_path:  null
            failure_forward: false
like image 484
user1063963 Avatar asked Nov 29 '11 08:11

user1063963


2 Answers

Create an authentication handler:

namespace YourVendor\UserBundle\Handler;

// "use" statements here

class AuthenticationHandler
implements AuthenticationSuccessHandlerInterface,
           AuthenticationFailureHandlerInterface
{
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        if ($request->isXmlHttpRequest()) {
            $result = array('success' => true);
            return new Response(json_encode($result));
        } else {
            // Handle non XmlHttp request here
        }
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        if ($request->isXmlHttpRequest()) {
            $result = array('success' => false);
            return new Response(json_encode($result));
        } else {
            // Handle non XmlHttp request here
        }
    }
}

Register the handler as a service:

services:
    authentication_handler:
        class: YourVendor\UserBundle\Handler\AuthenticationHandler

Register the service in the firewall:

firewalls:
    main:
        form_login:
            success_handler: authentication_handler
            failure_handler: authentication_handler

This is a rough example to give you the general idea — you'll need to figure out the details by yourself. If you're stuck and need further clarifications, put your questions in the comments and I'll try to elaborate the example.

like image 69
Elnur Abdurrakhimov Avatar answered Nov 09 '22 22:11

Elnur Abdurrakhimov


The normal symfony flow is to redirect you to a login page if you are not logged in, which works fine for humans. But you seems to be looking for a programmatic solution.

Have you tried setting _target_path in your form, to declare what the "next page" should be? Symfony is always going to forward you somewhere, but you can set that somewhere to wherever you want.

I found these two pages useful for describing the inner workings of the login form:

  • How to customize your form login (search for _target_path)
  • Security page in the handbook
like image 1
Neil Katin Avatar answered Nov 09 '22 23:11

Neil Katin