Magento 2:用户因非活动自动登出时,自定义Logout偏好未生效需重定向
嘿,这个问题我熟!你之前只覆盖了手动登出的Magento\Customer\Controller\Account\Logout控制器,但非活动自动登出的逻辑根本不走这个流程,所以你的偏好设置没生效完全正常~
核心原因
Magento 2里,用户手动点击登出会触发Logout控制器,但非活动超时导致的自动登出,是当用户session过期后,访问需要登录的页面时,由客户会话的认证逻辑触发重定向,核心涉及的类是:
Magento\Customer\Model\Session:负责管理客户会话,当session过期时,isLoggedIn()会返回falseMagento\Customer\App\Action\Plugin\Authenticate:这个插件会在需要登录的控制器执行前检查会话状态,若未登录则默认重定向到登录页
解决方案:自定义插件修改非活动登出的重定向URL
我们可以通过创建一个插件,拦截会话认证的重定向逻辑,把默认的登录页URL替换成你指定的地址。
步骤1:创建插件类
在你的自定义模块中,新建如下文件:app/code/YourVendor/YourModule/Plugin/Customer/Session/AuthenticatePlugin.php
<?php namespace YourVendor\YourModule\Plugin\Customer\Session; use Magento\Customer\Model\Session as CustomerSession; use Magento\Framework\App\Response\RedirectInterface; use Magento\Framework\UrlInterface; class AuthenticatePlugin { /** * @var RedirectInterface */ private $redirect; /** * @var UrlInterface */ private $url; public function __construct( RedirectInterface $redirect, UrlInterface $url ) { $this->redirect = $redirect; $this->url = $url; } /** * 拦截authenticate方法,修改非活动登出的重定向URL * * @param CustomerSession $subject * @param callable $proceed * @param string $loginUrl * @return mixed */ public function aroundAuthenticate( CustomerSession $subject, callable $proceed, $loginUrl = null ) { // 判断是否是session过期导致的非活动登出(session存在但登录状态失效) if (!$subject->isLoggedIn() && $subject->getSessionId()) { // 替换成你需要的指定URL,比如自定义的登出提示页 $customRedirectUrl = $this->url->getUrl('your/custom/url'); $this->redirect->redirect($subject->getResponse(), $customRedirectUrl); return; } // 其他正常未登录场景走原逻辑 return $proceed($loginUrl); } }
步骤2:配置插件
在模块的di.xml中注册这个插件:app/code/YourVendor/YourModule/etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Customer\Model\Session"> <plugin name="yourmodule_customer_session_authenticate" type="YourVendor\YourModule\Plugin\Customer\Session\AuthenticatePlugin" sortOrder="10"/> </type> </config>
步骤3:验证效果
- 清理缓存:
bin/magento cache:clean - 临时缩短客户会话超时时间(后台路径:Stores > Configuration > Advanced > System > Session Cookie Management,调整
Cookie Lifetime为一个很小的值,比如60秒) - 登录后等待会话过期,再访问需要登录的页面,就能看到页面重定向到你指定的URL了
补充说明
如果你需要区分“手动登出”和“非活动登出”的不同重定向逻辑,你已经覆盖了Logout控制器处理手动场景,加上这个插件就能完美覆盖两种情况啦~
内容的提问来源于stack exchange,提问作者Gianni Di Falco
相关产品推荐
相关产品推荐

