You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]属性注入失效的已知问题。

解决方法

  1. 配置安全访问控制,在config/packages/security.yaml中添加对应路由的权限要求:
security:
    # 省略其他已有配置
    access_control:
        - { path: ^/users, roles: ROLE_USER }
  1. 检查App\Entity\User类,确认实现了UserInterface接口及其所有必须方法,示例如下:
use Symfony\Component\Security\Core\User\UserInterface;

class User implements UserInterface
{
    // 实现 getRoles(), getPassword(), getSalt(), eraseCredentials(), getUsername() 等方法
}
  1. 临时兼容方案:直接使用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());
    }
}
  1. 升级symfony/security-http组件到对应兼容版本:
composer update symfony/security-http

内容的提问来源于stack exchange,提问作者Denzel Brazhnikoff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:06:03