gpt4 book ai didi

php - 在 Symfony2 中从 AuthenticationHandler 设置 flashMessage

转载 作者:可可西里 更新时间:2023-11-01 00:09:00 24 4
gpt4 key购买 nike

我在使用 FOSUserBundle 时遇到问题,因为每当我使用错误的凭据登录时,我都会收到完整的堆栈跟踪信息作为错误消息:

Error! exception 'Symfony\Component\Security\Core\Exception\BadCredentialsException' with message 'Bad credentials' in /var/www/html/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php:90

这对我来说很丑陋,所以对用户来说也很丑陋。所以我在考虑两种解决方案:更改为我正在处理的 AJAX 登录但它不起作用或者我做错了什么(将在下面解释)并找到一种方法来更改那个丑陋的消息(我没有得到这是一个,所以任何建议都会有所帮助)。

现在关于第一个解决方案,这就是我所做的:

  • 实现一个AuthenticationHandler:

    <?php

    namespace UsuarioBundle\Handler;

    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Bundle\FrameworkBundle\Routing\Router;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
    use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;

    class AuthenticationHandler
    implements AuthenticationSuccessHandlerInterface,
    AuthenticationFailureHandlerInterface
    {
    private $router;

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

    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
    if ($request->isXmlHttpRequest()) {
    // do I need something here?
    } else {
    // If the user tried to access a protected resource and was forces to login
    // redirect him back to that resource
    if ($targetPath = $request->getSession()->get('_security.target_path')) {
    $url = $targetPath;
    } else {
    // Otherwise, redirect him to wherever you want
    $url = $this->router->generate('user_view', array('nickname' => $token->getUser()->getNickname()));
    }

    return new RedirectResponse($url);
    }
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
    if ($request->isXmlHttpRequest()) {
    // Handle XHR here
    } else {
    // Create a flash message with the authentication error message
    $request->getSession()->setFlash('error', $exception->getMessage());
    $url = $this->router->generate('user_login');

    return new RedirectResponse($url);
    }
    }
    }
  • 定义服务并注册处理程序:

    parameters:
    vendor_security.authentication_handler: UsuarioBundle\Handler\AuthenticationHandler

    services:
    authentication_handler:
    class: %vendor_security.authentication_handler%
    arguments: [@router]
    tags:
    - { name: 'monolog.logger', channel: 'security' }
  • 更改security.yml中的引用:

    防火墙: 主要的: 模式:^/ 表单登录: 供应商:fos_userbundle csrf_provider: form.csrf_provider 登录路径:/登录 检查路径:/login_check success_handler:authentication_handler failure_handler:authentication_handler

          logout:
    path: fos_user_security_logout
    target: /
    invalidate_session: false
    anonymous: ~

但是当我尝试使用无效凭据登录时出现此错误:

Attempted to call method "setFlash" on class "Symfony\Component\HttpFoundation\Session\Session" in /var/www/html/src/UsuarioBundle/Handler/AuthenticationHandler.php line 52.

为什么?我检查了 getSession() 方法,它是 HttpFoundation 的一部分,我将其包含在 use 语句中,那么我在这里做错了什么?

注意:我的代码主要来自 this所以我对此仍有一些疑问。

最佳答案

$request->getSession()->setFlash('error', 'error'); 是“旧”symfony 版本的符号。

现在你应该使用

$reqest->getSession()->getFlashBag()->add('error', $exception->getMessage());

此外,您确定显示 $exception 短信是个好习惯吗?我的意思是,我不知道这个 flash 将在哪个页面显示,但是如果用户,甚至是管理员——当然对 PHP 和一般编程一无所知——可以看到该页面等等消息,您应该尝试出于您的目的记录消息,但向用户显示其他内容。

关于php - 在 Symfony2 中从 AuthenticationHandler 设置 flashMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26173744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com