У меня проблема с FOSUserBundle, так как каждый раз, когда я вхожу с неверными учетными данными, я получаю полную трассировку стека в виде сообщения об ошибке:
Ошибка! исключение
‘Symfony \ Component \ Security \ Основные \ Exception \ BadCredentialsException’
с сообщением «Плохие учетные данные» в
/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
:
брандмауэры:
главный:
шаблон: ^ /
form_login:
провайдер: fos_userbundle
csrf_provider: form.csrf_provider
логин_путь: / логин
check_path: / login_check
success_handler: authentication_handler
обработчик ошибок: аутентификационный обработчик
logout:
path: fos_user_security_logout
target: /
invalidate_session: false
anonymous: ~
Но я получаю эту ошибку, когда пытаюсь войти с неверными учетными данными:
Попытка вызвать метод «setFlash» в классе
«Symfony \ Component \ HttpFoundation \ Session \ Session» в
/var/www/html/src/UsuarioBundle/Handler/AuthenticationHandler.php line
52.
Зачем? Я проверяю getSession()
метод, и это часть HttpFoundation
который я включаю в use
заявления, так что я тут делаю не так?
Примечание: я беру код в основном из этот тема так что для этого у меня все еще есть некоторые сомнения по этому поводу.
$request->getSession()->setFlash('error', 'error');
была запись для «старой» версии Symfony.
Теперь вы должны использовать
$reqest->getSession()->getFlashBag()->add('error', $exception->getMessage());
Кроме того, вы уверены, что это хорошая практика, чтобы показать $exception
текстовое сообщение? Я имею в виду, я не знаю, на какой странице будет отображаться эта вспышка, НО, если пользователь или даже администратор — который, конечно, почти ничего не знает о PHP и программировании в целом — может увидеть страницу, и поэтому сообщение, вы должны попытаться войти сообщение для вашей цели, но показать что-то еще для пользователя.
Других решений пока нет …