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

В файле 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...
    }

Ответы [ 2 ]

2 голосов
/ 27 марта 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');
    }

    // ...
}
1 голос
/ 27 марта 2019

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

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

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

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

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

...