symfony - AuthenticationSuccessHandlerInterface 和正确的重定向策略

标签 symfony

我有一个登录 success_handler,它将一些用户重定向到一个特殊的表单。 不管怎样,AuthenticationSuccessHandlerInterface 需要返回一个 Response 并且工作正常,除了一种情况。如果用户第一次填写错误的凭据并再次被重定向到登录页面,处理程序将在正确登录后再次将他重定向到登录页面。

如果我简单地使用选项 use_referer: true 它工作正常。所以我可以将逻辑而不是事件放在 Controller 中,但也许你们中的某些人可以为我提供解决方案。

谢谢

防火墙

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            success_handler: applypie_userbundle.login.handler
            #default_target_path: applypie_user_dashboard
            use_referer: true
        logout:       true
        anonymous:    true

事件

namespace Applypie\Bundle\UserBundle\EventListener;

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;


class NewUserListener implements AuthenticationSuccessHandlerInterface
{
    protected $router;

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        $user = $token->getUser();

        if(!$user->getApplicant() && !count($user->getCompanies())) {

            return new RedirectResponse($this->router->generate('applypie_user_applicant_create'));

        }
            return new RedirectResponse($request->headers->get('referer'));
    }
}

服务

applypie_userbundle.login.handler:
    class: Applypie\Bundle\UserBundle\EventListener\NewUserListener
    arguments: ["@router"]

最佳答案

我很高兴看到您已经完成了重定向工作。

您不需要 use_referer 因为它将是登录页面 URI(因为它是浏览器在 header 中发送的真实引用),只需采用用户尝试访问的 URI来自 session :

return new RedirectResponse($request->getSession()->get('_security.main.target_path'));

这里有更多相关信息:

http://symfony.com/doc/current/cookbook/security/target_path.html

如果您处于开发模式 (app_dev.php),您会发现很多重要信息,例如每个请求的 session 值,请查看开发工具栏。

关于symfony - AuthenticationSuccessHandlerInterface 和正确的重定向策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19008842/

相关文章:

php - Symfony 和 Percona

php - Symfony2 Twig 包括 Assets 无法正常工作的 header

php - Symfony:具有灵活关系的实体及其(子)形式 - 如何设计?

mysql - 同时从多个表中选择数据按日期排序(流)

php - 在表单 : "cannot read index ... doesn' t implement\ArrayAccess"? 中添加一个 ImageType

php - Doctrine persist() 对于 SQL 注入(inject)是安全的吗?

php - 如何以编程方式登录/验证用户?

symfony - Sonata 管理员从 ListView 中删除批处理列

php - 在 Symfony2 中反序列化或解析 XML 响应

javascript - 当用户返回页面时保存最后一个表过滤查询