在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...
}
答案 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');
}
您应注意,您重定向到的路由不会引起其他重定向,从而使您陷入无限循环。