symfony login admin fosuserbundle

symfony - No se puede acceder al área de administración de FOSUserBundle después de iniciar sesión



login (2)

De forma predeterminada, el usuario creado tiene el rol ROLE_USER que se guarda en DB como una matriz vacía convertida a JSON a:0:{} . En FOSUserBundle existen algunas útiles herramientas de línea de comandos . Debería utilizar Promover un usuario para el usuario ROLE_ADMIN esta manera:

$ php app/console fos:user:promote username ROLE_ADMIN

Después de eso, el username su username usuario tendrá acceso al panel de administración, donde podrá promocionar a otros usuarios manualmente.

Para crear usuarios con diferentes tipos de ROLE , debe escribir el evento listener para el evento fos_user.registration.initialize (o incluso fos_user.registration.success ), como este:

class RegistrationListener { public function setUserRole(UserEvent $event) { $request = $event->getRequest(); if (/* some conditions */) { $user = $event->getUser(); $user->addRole(''ROLE_STH''); } } }

Tenga cuidado al usar este oyente para configurar ROLE_ADMIN . Promover un comando de usuario está destinado a agregar ROLE_ADMIN como ROLE_ADMIN .

Estoy usando FOSUserBundle para la sección de administración, así como frontend, siguiendo las instrucciones dadas en:

https://github.com/FriendsOfSymfony/FOSUserBundle/issues/849

Para frontend, todo funciona bien, pero para la sección de administración cuando accedo a mi área de /admin entonces me redireccionan a la página de inicio de sesión /admin/login (eso es correcto). Una vez que proporciono el nombre de usuario y la contraseña del administrador, como se indica en la ruta de destino predeterminada después de iniciar sesión

default_target_path: /admin/

definido en security.yml está redireccionando a /admin (que también es correcto) pero recibo 403 error prohibido

**Access Denied** 403 Forbidden - AccessDeniedHttpException 1 linked Exception: AccessDeniedException

En mi security.yml cuando elimino la siguiente línea:

- { path: ^/admin/, role: ROLE_ADMIN }

luego puedo acceder al área / admin después de iniciar sesión.

También observé que cada vez que creo un nuevo usuario usando /register en la interfaz ingresa a:0:{} en el campo de roles de la tabla de base de datos fos_user . Ahora quiero saber:

Qué cambios necesitaré hacer a nivel de script para crear diferentes tipos de usuarios, como administrador, usuario normal, etc. para que el código de seguridad anterior.yml que eliminé funcione sin quitar


@neeraj, como respuesta a su comentario aquí, el área de administración de FOSUserBundle no es accesible después del inicio de sesión porque sé que no es posible hacerlo solo con security.yml, pero puede ir con el oyente, no hay mucho que hacer.

crea la carpeta EventListener en tu Bundle, luego crea SecurityListener.php

<?php namespace Your/NameBundle/EventListener; use Symfony/Bundle/FrameworkBundle/Routing/Router; use Symfony/Component/Security/Core/SecurityContext; use Symfony/Component/EventDispatcher/EventDispatcher; use Symfony/Component/Security/Http/Event/InteractiveLoginEvent; use Symfony/Component/HttpKernel/KernelEvents; use Symfony/Component/HttpKernel/Event/FilterResponseEvent; use Symfony/Component/HttpFoundation/RedirectResponse; class SecurityListener { protected $router; protected $security; protected $dispatcher; public function __construct(Router $router, SecurityContext $security, EventDispatcher $dispatcher) { $this->router = $router; $this->security = $security; $this->dispatcher = $dispatcher; } public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { $this->dispatcher->addListener(KernelEvents::RESPONSE, array($this, ''onKernelResponse'')); } public function onKernelResponse(FilterResponseEvent $event) { if ($this->security->isGranted(''ROLE_ADMIN'')) { $response = new RedirectResponse($this->router->generate(''YOURCoreBundle_adminpage'')); } elseif ($this->security->isGranted(''ROLE_USER'')) { $response = new RedirectResponse($this->router->generate(''YOURBundle_userpage'')); } else { $response = new RedirectResponse($this->router->generate(''YOURCoreBundle_homepage'')); } $event->setResponse($response); } }

y en services.xml add

<parameters> <parameter key="yourbundle.listener.login.class">Your/NameBundle/EventListener/SecurityListener</parameter> </parameters> <services> <service id="yourbundle.listener.login" class="%yourbundle.listener.login.class%"> <tag name="kernel.event_listener" event="security.interactive_login" method="onSecurityInteractiveLogin"/> <argument type="service" id="router"/> <argument type="service" id="security.context"/> <argument type="service" id="event_dispatcher"/> </service> </services>