我有一个像这样的控制器:
class ArticleController extends Controller implements AuthControllerInterface
{
public function listAllArticleAction (Request $request)
{
// ... ignore
}
public function addArticleAction (Request $request)
{
// ... ignore
}
// ... another article control method
}
想要添加文章的用户必须登录,但是,用户无需登录即可访问listAllArticleAction。
我尝试使用Event Listener来解决问题:
class AuthListener
{
private $m_router;
public function __construct(Router $router)
{
$this->m_router = $router;
}
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if ($controller[0] instanceof AuthControllerInterface) {
$session = $event->getRequest()->getSession()->get('userId');
if (!isset($session)) {
$redirectUrl = $this->m_router->generate('page.login');
$event->setController(function () use ($redirectUrl){
return new RedirectResponse($redirectUrl);
});
}
}
}
}
如果用户没有登录,用户将被重定向到登录页面,但是,这种方法也会对" listAllArticleAction"生效。方法
我认为在函数开头检查会话并不是一个好主意,因为我有另一篇文章控制方法,例如" deleteArticle"," getArticle"等等,其中一些需要先登录,其他则不需要登录。
如何使用事件侦听器实现此功能?或者,有没有更好的方法来做到这一点?
答案 0 :(得分:2)
您正在尝试手动执行已在Symfony中实现的内容。
你有两种方法可以做到这一点。查看Security Component
的文档在安全配置中使用 access_control
部分(security.yml或通过注释)
另见How Does the Security access_control Work?
在YAML配置中,它将类似于:
security:
access_control:
- { path: ^/path/to/add_article, roles: IS_AUTHENTICATED_REMEMBERED }
检查是否在操作开始时记录了使用情况
if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
throw $this->createAccessDeniedException();
}
答案 1 :(得分:0)
正确的方法是:
class ArticleController extends Controller
{
public function listAllArticleAction (Request $request)
{
// ... ignore
}
public function addArticleAction (Request $request)
{
if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
throw $this->createAccessDeniedException();
}
// ... ignore
}
// ... another article control method
}
如果您的用户未登录,他们将被重定向到登录页面