php - 根据属性重定向用户
问题描述
好吧,我想做的是检查用户状态是否为“待处理”,如果是,我会将他重定向到“/待处理”页面。
现在我需要对几乎整个网站进行此项检查。
我尝试了决策经理,但无法重定向,还有其他方法吗?
这应该只为登录的用户调用
安全.yaml
access_decision_manager:
service: App\Security\StatusAuthenticator
和 StatusAuthenticator
<?php
namespace App\Security;
use App\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
class StatusAuthenticator implements AccessDecisionManagerInterface
{
/**
* @param TokenInterface $token
* @param array $attributes
* @param null $object
* @return bool|void
*/
public function decide(TokenInterface $token, array $attributes, $object = null)
{
if($token->getUser()->getStatus() == User::USER_STATUS_PENDING) {
// Needs to be redirected to /pending
return false;
}
return true;
}
}
解决方案
由于您需要“在几乎整个网站上进行检查”,因此您可以使用一个EventListener
会在每个请求上触发的功能,您可以在那里检查您是否有经过身份验证的用户及其状态。
// src/EventListener/PendingUserListener.php
namespace App\EventListener;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
class PendingUserListener implements EventSubscriberInterface
{
/**
* @var Security
*/
private $security;
/**
* @var UrlGeneratorInterface
*/
private $urlGenerator;
public function __construct(Security $security, UrlGeneratorInterface $urlGenerator)
{
$this->security = $security;
$this->urlGenerator = $urlGenerator;
}
public static function getSubscribedEvents()
{
return [ KernelEvents::REQUEST => 'onKernelRequest' ];
}
public function onKernelRequest(RequestEvent $event)
{
$pending_route = 'pending';
$user = $this->security->getUser();
if (!$event->isMasterRequest()) {
return;
}
if (!$user instanceof UserInterface) {
return;
}
// Check if the requested page is 'pending', prevent redirect loops
if ($pending_route === $event->getRequest()->get('_route')) {
return;
}
// RedirectResponse expects a full url, generate from route name
if (User::USER_STATUS_PENDING == $user->getStatus()) {
$event->setResponse(
new RedirectResponse($this->urlGenerator->generate($pending_route))
);
}
}
}
推荐阅读
- excel - 有没有办法编写一个宏来循环文本连接excel中的多行数据?
- wpf - 媒体播放器中的暂停和恢复
- javascript - 使用 Blazor 在浏览器中播放本地音频文件
- java - 如何从参数类型中提取 Mono 到上层?
- web3py - 无法在 python virtual_enviroment 中安装 web3
- python - 使用 string.decode("utf-8","ignore") 时结果错误
- python - 预测模型需要 3 维但形状不匹配的数组
- google-apps-script - 覆盖文件 Google 表格脚本
- mongodb - 无法使用 Golang 将记录保存到 Mongodb
- python - tensorflow2.1 InvalidArgumentError:断言失败:[0] [Op:Assert] 名称:EagerVariableNameReuse