我遇到FOSUserBundle的问题,因为任何时候我使用错误的凭据登录时都会得到完整的stacktrace作为错误消息:
错误!/ var / www / html / vendor / symfony / symfony / src / Symfony / Component / Security / Core / Authentication / Provider / UserAuthenticationProvider中带有消息“错误凭据”的异常“ Symfony \ Component \ Security \ Core \ Exception \ BadCredentialsException”。的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
:
防火墙:主要:模式:^ / form_login:提供者:fos_userbundle csrf_provider:form.csrf_provider login_path:/ login check_path:/ login_check success_handler:authentication_handler failure_handler:authentication_handler
logout:
path: fos_user_security_logout
target: /
invalidate_session: false
anonymous: ~
但是,当我尝试使用无效的凭据登录时,出现此错误:
尝试在/var/www/html/src/UsuarioBundle/Handler/AuthenticationHandler.php第52行中的类“ Symfony \ Component \ HttpFoundation \ Session \ Session”上调用方法“ setFlash”。
为什么?我检查getSession()
方法,并将其HttpFoundation
包含在use
语句中,所以我在这里做错了什么?
注意:我主要从该主题获取代码,因此,我对此仍有一些疑问。
$request->getSession()->setFlash('error', 'error');
是“旧” symfony版本的一种表示法。
现在您应该使用
$reqest->getSession()->getFlashBag()->add('error', $exception->getMessage());
此外,您确定显示$exception
短信是一种好习惯吗?我的意思是,我不知道如果用户或什至是管理员,该Flash不会显示在哪个页面上-当然,对于一般的PHP和编程知识也不了解-可以看到tha页面,因此消息,您应该尝试记录该消息以达到目的,但向用户显示其他内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句