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>