重定向页面Symfony

博格丹·伊万诺夫(Bogdan Ivanov)

程序员,面对这样的问题。用户授权后,我想重定向到包含其数据的页面,但出现错误。这是代码

firewalls:
    main:
        pattern: /.*
        form_login:
            login_path: /
            check_path: /login_check
            default_target_path:  /user/{id}/show  //How to use the id of my controller. In routing i create it
            always_use_default_target_path: true
            use_referer:        true
        logout:
            path: /logout
            target: /
        security: true
        anonymous: true
达拉格·恩赖特(Darragh Enright)

我假设您想重定向到页面并显示登录用户的数据。我建议改用非动态路线会更直接;例如/user/show

在这种情况下,您不需要路由中的id,因为无论重定向到哪个路由,您都可以通过以下方式在控制器中获取经过身份验证的用户的对象:

class HomeController extends Controller
{
    /**
     * @Route("/user/show", name="user_show")
     * @Template()
     */
    public function userAction()
    {
        // do stuff...
        // send current user object to view
        return [
            'user' => $this->getUser(),
        ];
    }

我认为这是最直接的方法,否则您已经具有当前用户的上下文等。并且,我认为您需要在这里使用用户ID的特定原因-您可以实现登录处理程序,从而允许您拦截登录事件并运行一些自定义代码。

为了完整起见,您可以按以下步骤进行操作(在这种情况下,未经测试且不建议这样做):

user/{id}/show在名为的控制器中创建一个动作user_show

然后,在services.yml您的AppBundle(或同等产品)捆绑包中:

app.event_listener.login_success_handler:
    class:  AppBundle\EventListener\LoginSuccessHandler
    arguments:
        - @router
    tags:
        - { name: 'login.handler', channel: 'security' }

然后创建一个AppBundle/EventListener/LoginSuccessHandler.php类:

<?php

namespace AppBundle\EventListener;

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

/**
 * LoginSuccessHandler
 */
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
    public function __construct(Router $router)
    {
        $this->router   = $router;
    }

    /**
     * onAuthenticationSuccess
     *
     * @param  \Symfony\Component\HttpFoundation\Request                            $request
     * @param  \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        $routeParams = [
            'id' => $token->getUser()->getId(),
        ];

        return new RedirectResponse($this->router->generate('user_show', $routeParams));
    }
}

这样的事情。这里的目标是您:

  • 拦截登录成功事件
  • 获取经过身份验证的用户
  • 手动重定向

重申一下,我还没有测试过上面的代码,所以是YMMV。我认为这种情况下不需要这种方法-如果需要成功登录时需要一些特定的自定义功能,则登录事件处理程序很有用。但是,您可以轻松地在控制器中获取当前的用户上下文,该上下文涵盖了我的经验中的大多数用例。

希望这可以帮助 :)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章