php - traditional - symfony error login
redirigir después de iniciar sesión paquete de usuario fos Symfony (2)
Debe agregar un LoginSuccessHandler que implemente la interfaz AuthenticationSuccessHandler,
Luego puede establecer su lógica de redirección dentro del método onAuthenticationSuccess()
como sigue,
namespace XXX/YourBundler/Handler;
use Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface;
use Symfony/Component/Security/Core/Authentication/Token/TokenInterface;
use Symfony/Component/Security/Core/SecurityContext;
use Symfony/Component/HttpFoundation/Request;
use Symfony/Component/HttpFoundation/RedirectResponse;
use Symfony/Component/Routing/Router;
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
protected $router;
protected $security;
public function __construct(Router $router, SecurityContext $security)
{
$this->router = $router;
$this->security = $security;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
if ($this->security->isGranted(''ROLE_XXXX_1''))
{
$response = new RedirectResponse($this->router->generate(''route_1''));
}
elseif ($this->security->isGranted(''ROLE_XXXX_2''))
{
$response = new RedirectResponse($this->router->generate(''route_2''));
}
// ...
}
}
Su controlador también debe estar registrado como un servicio,
parameters:
security.authentication.success_handler.class: XXX/YourBundler/Handler/AuthenticationSuccessHandler
services:
security.authentication.customized_success_handler:
class: %security.authentication.success_handler.class%
public: false
arguments: [@router, @security.context]
A continuación, debe agregar la siguiente línea a la configuración de seguridad del firewall,
success_handler: security.authentication.customized_success_handler
Tengo un paquete que amplía el paquete de usuario de fos y otro paquete.
Quiero una vez que un usuario sea autenticado para redirigirlo según su administrador de funciones o usuario simple a diferentes vistas.
Mi problema es que no puedo encontrar el controlador del inicio de sesión desde donde haré el redireccionamiento.
El rol es un atributo de la entidad User
que proviene de la base de datos.
Puede sobreescribir la función renderLogin de la siguiente manera:
class SecurityController extends BaseController
{
/**
* Renders the login template with the given parameters. Overwrite this function in
* an extended controller to provide additional data for the login template.
*
* @param array $data
*
* @return /Symfony/Component/HttpFoundation/Response
*/
protected function renderLogin(array $data)
{
$securityContext = $this->get(''security.context'');
$router = $this->container->get(''router'');
// if ($this->get(''security.context'')->getToken()->getUser() instanceof /FOS/UserBundle/Propel/User) {
// $url = $this->container->get(''router'')->generate(''dashboard'');
// return new RedirectResponse($url);
// }
if ($securityContext->isGranted(''ROLE_ADMIN'')) {
return new RedirectResponse($router->generate(''dashboard''), 307);
}
if ($securityContext->isGranted(''ROLE_USER'')) {
return new RedirectResponse($router->generate(''front_page_home''), 307);
}
$requestAttributes = $this->container->get(''request'')->attributes;
if ($requestAttributes->get(''_route'') == ''admin_fos_user_security_login'') {
$template = sprintf(''FOSUserBundle:Security:login.html.twig'');
$data[''admin''] = true;
} else {
$template = sprintf(''FOSUserBundle:Security:login.html.twig'');
$data[''admin''] = false;
}
return $this->container->get(''templating'')->renderResponse($template, $data);
}
}