Symfony4登录开发报错:getUser方法需返回UserInterface类型
问题解决:Symfony4登录getUser方法返回RedirectResponse报错
错误原因
getUser()方法的规则是必须返回实现UserInterface的实例,你在用户名不存在时返回了RedirectResponse,违背了这个方法的返回值要求,所以触发了报错。
修复方案
不要在getUser()里直接返回重定向,而是抛出认证相关的异常,让Symfony的安全组件自动处理跳转和错误提示。具体修改如下:
首先引入对应的异常类:
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
然后修改getUser()方法:
public function getUser($credentials, UserProviderInterface $userProvider) { $token = new CsrfToken('authenticate', $credentials['csrf_token']); if (!$this->csrfTokenManager->isTokenValid($token)) { throw new InvalidCsrfTokenException(); } $user = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $credentials['username']]); if (!$user) { // 抛出自定义认证异常,Security组件会自动跳转回登录页 throw new CustomUserMessageAuthenticationException('用户名不存在或密码错误'); } return $user; }
补充说明
Symfony的认证流程中,getUser()的职责就是查找并返回用户对象,认证失败的逻辑(比如跳转、错误提示)应该由Security组件统一处理,而不是在这个方法里直接返回响应。抛出CustomUserMessageAuthenticationException后,你可以在登录模板里通过app.session.flashbag.get('security_login_error')获取错误信息显示给用户。
内容的提问来源于stack exchange,提问作者yahya
相关产品推荐
相关产品推荐

