symfony - form - Redireccionar FOSUserBundle desde la página de inicio de sesión después de iniciar sesión
symfony error login (4)
La solución más fácil es agregar estas dos líneas a su aplicación / config / security.yml:
always_use_default_target_path & default_target_path , por ejemplo:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: /login
check_path: /login_check
always_use_default_target_path: false
default_target_path: /your/start/path/
Simplemente quiero que el usuario administrador o el usuario final intente acceder a la página de inicio de sesión incluso después de iniciar sesión
/admin/login (admin user)
O
/login (front end user)
luego deberían ser redirigidos a su página de inicio relacionada como /admin
o /
Puede anular FOSUserBundle/Controller/SecurityController y agregar el siguiente código en la parte superior de loginAction
.
use Symfony/Component/HttpFoundation/RedirectResponse;
// ...
public function loginAction(Request $request)
{
$authChecker = $this->container->get(''security.authorization_checker'');
$router = $this->container->get(''router'');
if ($authChecker->isGranted(''ROLE_ADMIN'')) {
return new RedirectResponse($router->generate(''admin_home''), 307);
}
if ($authChecker->isGranted(''ROLE_USER'')) {
return new RedirectResponse($router->generate(''user_home''), 307);
}
// ...
Simplemente redirija en el controlador de la página que agregó en default_target_path
a la dirección deseada, por ejemplo, si coloca default_target_path: /index
e index es una acción definida en HomePageCOntroller
, vaya a HomePageCOntroller
, pruebe si el usuario actual es admin o no con:
if (($this->container->get(''security.context'')->isGranted(''ROLE_ADMIN'')))
y luego redirigirlo al espacio de administración.
Redirigir al iniciar / cerrar sesión en Symfony2 usando LoginHandlers
Debe implementar AuthenticationSuccessHandlerInterface
para manejar la decisión de último minuto cuando el éxito de inicio de sesión.
Implemente AuthenticationSuccessHandlerInterface:
<?php
// AcmeBundle/Security/LoginSuccessHandler.php
namespace AcmeBundle/Security;
use Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface;
use Symfony/Component/Security/Core/Authentication/Token/TokenInterface;
use Symfony/Component/Security/Core/Authorization/AuthorizationChecker;
use Symfony/Component/HttpFoundation/Request;
use Symfony/Component/HttpFoundation/RedirectResponse;
use Symfony/Component/Routing/Router;
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface {
protected $router;
protected $authorizationChecker;
public function __construct(Router $router, AuthorizationChecker $authorizationChecker) {
$this->router = $router;
$this->authorizationChecker = $authorizationChecker;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token) {
$response = null;
if ($this->authorizationChecker->isGranted(''ROLE_ADMIN'')) {
$response = new RedirectResponse($this->router->generate(''backend''));
} else if ($this->authorizationChecker->isGranted(''ROLE_USER'')) {
$response = new RedirectResponse($this->router->generate(''frontend''));
}
return $response;
}
}
Registra tu clase como un servicio:
# app/config/services.yml
services:
authentication.handler.login_success_handler:
class: AcmeBundle/Security/LoginSuccessHandler
arguments: [''@router'', ''@security.authorization_checker'']
Agregue una referencia a su clase LoginSuccessHandler en el firewall
# app/config/security.yml
firewalls:
main:
pattern: ^/
form_login:
success_handler: authentication.handler.login_success_handler