Как настроить access_control, чтобы запретить пользователям, имеющим ROLE_USER, доступ к пути: ^ / login после успешного входа в систему?

В файле security.yaml мы определяем контроль доступа для различных маршрутов и РОЛИ, которые могут получить доступ к этому же маршруту.

Но как мы можем установить пользователя, который вошел в систему, но не может повторно посетить страницу / login, пока он не выйдет из системы и "ROLE_USER" не изменится на "anon".

Я новичок в Symfony 4.2.

Контроллер:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
//use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="login")
     */
    public function login(Request $request, AuthenticationUtils $utils, AuthorizationCheckerInterface $authChecker)
    {
        // to check whether user is looged-in
        if ($authChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
            die('Logged in user cannot access this page');
        }
        // get the login error if there is one
        $error = $utils->getLastAuthenticationError();

        // last username entered by the user
        $lastUsername = $utils->getLastUsername();
        return $this->render('security/login.html.twig', [
            'last_username' => $lastUsername,
            'error' => $error
            ]);
    }

    public function logout()
    {
        # code...
    }

person Saurabh    schedule 27.03.2019    source источник
comment
Разве не было бы лучше, если бы вы перенаправляли аутентифицированных пользователей со страницы входа на стартовую страницу (или любую подходящую страницу)?   -  person cezar    schedule 27.03.2019


Ответы (2)


Как я уже упоминал в комментариях, на мой взгляд, бросать AccessDeniedException уже вошедшему в систему пользователю - не лучший подход. Что подумают ваши пользователи? Если я уже вошел в систему, почему я не могу получить доступ к странице, к которой я обычно могу получить доступ, даже если я не вошел в систему.

Поэтому я настоятельно рекомендую перенаправить зарегистрированных пользователей при доступе к пути /login на стартовую страницу вашего приложения.

Просто адаптируйте блок if-condition в методе login вашего SecurityController:

if ($authChecker->isGranted('IS_AUTHENTICATED_FULLY)) {
    $this->redirectToRoute('name of the route - replace with an appropriate value');
}

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

person cezar    schedule 27.03.2019

Вы не можете запретить доступ для вошедшего в систему пользователя к странице входа, отредактировав security.yml. Все пользователи приложения Symfony, независимо от того, вошли они в систему или нет, будут иметь базовые права доступа: IS_AUTHENTICATED_ANONYMOUSLY и Symfony не имеет исключительной роли для незарегистрированного пользователя.

Однако вы можете добиться того же, проверив, вошел ли пользователь в ваш контроллер или нет, и выполнить перенаправление или выбросить AccessDeniedException:

public function login($name, AuthorizationCheckerInterface $authChecker)
{
    if ($authChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
        throw new AccessDeniedException('Logged in user cannot access this page');
    }

    // ...
}
person Thai Duong Tran    schedule 27.03.2019
comment
Какой класс для AccessDeniedException ?? - person Saurabh; 27.03.2019
comment
если утверждение неверно. Это должно быть 'if ($ authChecker- ›isGranted (' IS_AUTHENTICATED_FULLY ')) {throw new AccessDeniedException (' Пользователь, вошедший в систему, не может получить доступ к этой странице '); } ' - person Saurabh; 27.03.2019
comment
Хорошее место, я скопировал пример из документа Symfony и не редактировал его. - person Thai Duong Tran; 27.03.2019
comment
Какой класс для AccessDeniedException ?? - person Saurabh; 27.03.2019
comment
@Saurabh Это от Symfony Symfony\Component\Security\Core\Exception\AccessDeniedException - person Iwan Wijaya; 27.03.2019
comment
Вы упомянули перенаправление, и это гораздо лучший вариант, чем выброс исключения. С точки зрения UX, я считаю ужасным путать аутентифицированного пользователя с AccessDeniedException. - person cezar; 27.03.2019
comment
@IwanWijaya: да, я использовал то же самое, но это дает мне ошибку: «слишком много перенаправлений». и localhost отказываются подключаться. Я обновил свой вопрос с помощью контроллера. пожалуйста, проверьте - person Saurabh; 27.03.2019