-
-
Save marydn/8061424 to your computer and use it in GitHub Desktop.
# src/Acme/DemoBundle/Security/Authentication/Handler/LoginSuccessHandler.php | |
<?php | |
namespace Acme\DemoBundle\Security\Authentication\Handler; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\RedirectResponse; | |
use Symfony\Component\Routing\Router; | |
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; | |
use Symfony\Component\Security\Core\SecurityContext; | |
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; | |
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface | |
{ | |
protected | |
$router, | |
$security; | |
public function __construct(Router $router, SecurityContext $security) | |
{ | |
$this->router = $router; | |
$this->security = $security; | |
} | |
public function onAuthenticationSuccess(Request $request, TokenInterface $token) | |
{ | |
// URL for redirect the user to where they were before the login process begun if you want. | |
// $referer_url = $request->headers->get('referer'); | |
// Default target for unknown roles. Everyone else go there. | |
$url = 'homepage'; | |
if($this->security->isGranted('ROLE_USER')) { | |
$url = 'user_homepage'; | |
} | |
elseif($this->security->isGranted('ROLE_ADMIN')) { | |
$url = 'admin_dashboard'; | |
} | |
$response = new RedirectResponse($this->router->generate($url)); | |
return $response; | |
} | |
} |
# app/config/security.yml | |
security: | |
... | |
firewalls: | |
main: # name of your firewall | |
form_login: | |
... | |
use_referer: false | |
success_handler: login_success_handler |
# src/Acme/DemoBundle/Resources/config/services.yml | |
parameters: | |
acme_demo.authentication.handler.login_success_handler.class: Acme\DemoBundle\Security\Authentication\Handler\LoginSuccessHandler | |
services: | |
login_success_handler: | |
class: %acme_demo.authentication.handler.login_success_handler.class% | |
arguments: [@router, @security.context] | |
tags: | |
- { name: 'monolog.logger', channel: 'security' } |
.../routing.yml
index:
pattern: /
defaults: { _controller: ACMEBundle:Security:index }
.../SecurityController
public function indexAction()
{
if($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')){
return $this->redirectToRoute('foo', array());
}else{
return $this->redirectToRoute('bar', array());
}
}
I'm trying to implement this solution but I've some problems with the redirection, the login form doesn't redirect after a successful login but I get the HTML code of the redirected page in my Javascript console. Any ideas?
I've done a temporary solution, returning a Json and redirecting to desired target URL by Javascript:
$url = $this->router->generate('homepage');
$result = array(
'success' => true,
'function' => 'onAuthenticationSuccess',
'error' => false,
'message' => 'OK',
'url' => $url
);
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
Then in Javascript: window.location.replace(data.url);
For some reason the RedirectResponse
doesn't work for me :(
we need to check if isGranted as ROLE_ADMIN before , because ROLE_ADMIN has ROLE_USER also.
Thank you, it works like a charm.
How can you make this work in symfony 4??
You are the best!!! Thank you very much! On symfony 4 works fine!
Thanks for sharing!! Also might want to take a look at:
https://stackoverflow.com/questions/15918617/symfony2-extending-defaultauthenticationsuccesshandler
In the latest versions of Symfony,
SecurityContext
is deprecated.You have to use: