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

Sulu CMS自定义用户登录中“记住我”功能的实现问题求助

Sulu CMF 实现“记住我”功能的解决办法

问题定位

你已经完成Symfony文档中前两步配置(防火墙设置、添加_remember_me复选框),但因使用Sulu自带的认证机制,不清楚如何添加RememberMeBadge支持;且当前登录时服务器返回的REMEMBERME cookie值为deleted,这说明记住我功能的配置存在错误,导致Symfony主动清除了该cookie。

解决方案

Sulu默认认证基于Symfony安全组件,无需自定义认证器,只需调整配置并借助Symfony事件系统即可完成,具体步骤如下:

1. 完善security.yaml的记住我配置

确保防火墙中的remember_me配置正确关联Sulu用户提供者:

security:
    firewalls:
        # 替换为你的前台防火墙名称(比如main)
        main:
            # 其他已有配置...
            remember_me:
                secret: '%kernel.secret%'
                lifetime: 604800 # 有效期7天,可按需修改
                path: /
                always_remember_me: false
                user_provider: sulu_security.user_provider # 必须指定Sulu的用户提供者

2. 用事件监听器添加RememberMeBadge

利用Symfony的AuthenticationTokenCreatedEvent事件,在认证流程中自动添加RememberMeBadge:

创建监听器类:

// src/EventListener/RememberMeListener.php
namespace App\EventListener;

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\AuthenticationTokenCreatedEvent;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;

class RememberMeListener
{
    public function __invoke(AuthenticationTokenCreatedEvent $event): void
    {
        $token = $event->getAuthenticatedToken();
        $request = $event->getRequest();

        // 仅处理目标防火墙的用户名密码认证(替换为你的防火墙名称)
        if (!$token instanceof UsernamePasswordToken || $token->getFirewallName() !== 'main') {
            return;
        }

        // 检查表单是否提交了记住我勾选
        if ($request->request->getBoolean('_remember_me')) {
            $passport = $event->getPassport();
            $passport->addBadge(new RememberMeBadge());
        }
    }
}

在services.yaml中注册监听器:

services:
    App\EventListener\RememberMeListener:
        tags:
            - { name: kernel.event_listener, event: security.authentication_token_created }

3. 修复REMEMBERME cookie为deleted的问题

出现该问题的常见原因:

  • remember_me配置中user_provider未设置为sulu_security.user_provider
  • 表单的_remember_me复选框name属性有误,或提交值不是1/true
  • remember_me的secret与%kernel.secret%不匹配,或防火墙未启用remember_me

逐一排查以上配置后,重新测试登录,REMEMBERME cookie将生成有效值。

验证步骤

  1. 登录页勾选“记住我”复选框并提交登录
  2. 查看浏览器cookie列表,确认REMEMBERME存在且值不为deleted
  3. 关闭浏览器后重新打开网站,验证是否保持登录状态

内容的提问来源于stack exchange,提问作者Mario A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:48