Вопрос по fosuserbundle, symfony, admin, login – Область администратора FOSUserBundle не доступна после входа в систему

0

Я использую FOSUserBundle для административного раздела, а также веб-интерфейс, следуя инструкциям, приведенным на:

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

Для внешнего интерфейса все работает нормально, но для админки, когда я захожу в свою админку/admin тогда я перенаправлен на страницу входа/admin/login (это правильно). Как только я предоставлю имя пользователя и пароль администратора, то в соответствии с целевым путем по умолчанию после входа в систему

default_target_path: /admin/

определенный в security.yml, он перенаправляет на/admin (это также правильно), но я получаю 403 запрещенную ошибку

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

В моем security.yml, когда я удаляю строку ниже:

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

тогда я могу получить доступ к / админ области после входа в систему.

Я также заметил, что каждый раз, когда я создаю нового пользователя, используя/register на переднем конце он входитa:0:{} вроли полеfos_user таблица базы данных. Теперь я хочу знать:

Какие изменения мне нужно будет внести на уровне сценария, чтобы создать разных типов пользователей, таких как admin, обычный пользователь и т. Д., Чтобы приведенный выше код security.yml, который я удалил, работал без удаления

Ваш Ответ

2   ответа
7

По умолчанию созданный пользователь имеет рольROLE_USER который сохраняется в БД как пустой массив, преобразованный в JSONa:0:{}, В FOSUserBundle существует несколько полезныхИнструменты командной строки, Вы должны использоватьПродвинуть пользователя для заданного пользователяROLE_ADMIN как это:

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

После этого вашusername Пользователь будет иметь доступ к панели администратора, где вы можете продвигать других пользователей вручную.

Для создания пользователей с разнымиROLE типы вы должны написать прослушиватель событий дляfos_user.registration.initialize (или дажеfos_user.registration.success) событие, подобное этому:

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

Пожалуйста, будьте осторожны с использованием этого слушателя для настройки.ROLE_ADMINПродвинуть пользователя Команда предназначена для добавления роли, как.ROLE_ADMIN

продвижение пользователя в ROLE_ADMIN работает сейчас, но проблема в том, что пользователь-администратор также может войти в интерфейс, что я не хочу ... Какую строку кода мне нужно добавить в security.yml, чтобы ограничить пользователя-администратора для входа в внешний интерфейс? neeraj
ОК, так что вы можете создать отдельныйfirewalls для внешнего интерфейса и раздела администратора. И пользователь, который зарегистрирован через один из брандмауэраДоступ ко второму (по умолчанию, кромеcontext конфигурации). С другой стороны, вы также можете написать прослушиватель событий дляfos_user.security.implicit_login событие и перенаправить пользователя к определенной части вашего приложения. NHG
На самом деле, я думаю, что если это можно сделать из security.yml, это сэкономит мое время на написание кода для слушателя .... В любом случае, спасибо за ваш ответ ..... ура !! neeraj
Хорошо, я добавил - {path: ^ /, role: ROLE_USER} в security.yml, но администратор все же может войти в систему с конца. Я не хочу писать какой-либо код с использованием слушателя ... разве это не возможно через security.yml? если да то какой будет код? neeraj
По умолчанию иерархия ролей SF2ROLE_ADMIN имеетROLE_USER тоже (symfony.com/doc/current/book/security.html#hierarchical-roles). Что не так с слушателями событий? NHG
2

@neeraj, как ответ на ваш комментарий здесьОбласть администратора FOSUserBundle не доступна после входа в систему насколько я знаюНевозможно сделать это только с security.yml, но вы можете пойти со слушателем, не так много, чтобы сделать.

создайте папку EventListener в вашем Bundle, затем создайте SecurityListener.php

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);
    }
}

и в services.xml добавить


    Your\NameBundle\EventListener\SecurityListener



    
        
        
        
        
    

Похожие вопросы