如何设置access_control以禁止具有“ ROLE_USER”权限的用户访问路径:^ / login在成功登录后登录?

时间:2019-03-27 04:48:39

标签: symfony security symfony-4.2

security.yaml文件中,我们定义了各种路由的访问控制以及可以访问同一路由的ROLES。

但是我们如何设置已登录但无法重新访问/ 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 个答案:

答案 0 :(得分:2)

您无法通过编辑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 :(得分:1)

正如我在评论中提到的那样,我认为对已经登录的用户抛出AccessDeniedException并不是一个好方法。您的用户会怎么想?如果我已经登录,为什么不能访问即使我没有登录也可以正常访问的页面。

因此,我强烈建议在访问/login路径时将登录的用户重定向到应用程序的起始页面。

只需在您的login的方法SecurityController中修改if条件块:

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

您应注意,您重定向到的路由不会引起其他重定向,从而使您陷入无限循环。