Symfony #[CurrentUser]属性返回null 已登录仍报null成员方法调用错误
问题原因
- 你的
/users路由未配置为受防火墙保护的路径:Symfony 5.3 的#[CurrentUser]属性仅对需要登录权限的路由生效,若该路径在security.yaml中被标记为公共访问路径,即便你已登录,属性也会返回null。 App\Entity\User未实现Symfony\Component\Security\Core\User\UserInterface接口:#[CurrentUser]仅能识别实现了该接口的用户实体类。- 组件版本存在bug:你使用的
symfony/security-http组件版本低于5.3.7,该版本修复了#[CurrentUser]属性注入失效的已知问题。
解决方法
- 配置安全访问控制,在
config/packages/security.yaml中添加对应路由的权限要求:
security: # 省略其他已有配置 access_control: - { path: ^/users, roles: ROLE_USER }
- 检查
App\Entity\User类,确认实现了UserInterface接口及其所有必须方法,示例如下:
use Symfony\Component\Security\Core\User\UserInterface; class User implements UserInterface { // 实现 getRoles(), getPassword(), getSalt(), eraseCredentials(), getUsername() 等方法 }
- 临时兼容方案:直接使用
AbstractController内置的getUser()方法获取登录用户,该方法在5.x全版本兼容性更高,无需依赖属性注入:
<?php declare(strict_types=1); namespace App\Controller\User; use App\Entity\User; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; #[Route('/users', name: 'user.')] class UserController extends AbstractController { #[Route(name: 'list')] public function list(Request $request): Response { /** @var User $user */ $user = $this->getUser(); dd($user->getFirstName()); } }
- 升级
symfony/security-http组件到对应兼容版本:
composer update symfony/security-http
内容的提问来源于stack exchange,提问作者Denzel Brazhnikoff
相关产品推荐
相关产品推荐

