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将生成有效值。
验证步骤
- 登录页勾选“记住我”复选框并提交登录
- 查看浏览器cookie列表,确认
REMEMBERME存在且值不为deleted - 关闭浏览器后重新打开网站,验证是否保持登录状态
内容的提问来源于stack exchange,提问作者Mario A
相关产品推荐
相关产品推荐

