我搜索并找到了以下代码片段,当放置在Page_Controller类中时,它适用于前端用户,但在管理区域中完全无效.
public function init() { parent::init(); self::logoutInactiveUser(); } public static function logoutInactiveUser() { $inactivityLimit = 1; // in Minutes - deliberately set to 1 minute for testing purposes $inactivityLimit = $inactivityLimit * 60; // Converted to seconds $sessionStart = Session::get('session_start_time'); if (isset($sessionStart)){ $elapsed_time = time() - Session::get('session_start_time'); if ($elapsed_time >= $inactivityLimit) { $member = Member::currentUser(); if($member) $member->logOut(); Session::clear_all(); $this->redirect(Director::baseURL() . 'Security/login'); } } Session::set('session_start_time', time()); }
超过1分钟不活动后,管理员用户仍然登录并且会话未超时.
对于像我这样的人仍然在寻找解决方案,有一个更简单的选择.事实证明,目前唯一的好解决方案是禁用LeftAndMain.session_keepalive_ping,而 simon_w的解决方案因为ping而无法正常工作.此外,禁用此ping不应导致数据丢失(至少不会导致SilverStripe 3.3),因为用户在尝试提交其工作时将显示覆盖.验证其凭据后,他们的数据将照常提交给服务器.此外,对于那些(像我一样)寻找解决方案如何通过LeftAndMain.session_keepalive_ping使用_config.yml覆盖CMS ping的人继续阅读.
简单修复:在你的mysite / _config.php中,只需添加:
// Disable back-end AJAX calls to /Security/ping Config::inst()->update('LeftAndMain', 'session_keepalive_ping', false);
这将阻止CMS刷新会话,该会话将在幕后自然过期(并且不会在下一个请求时提交).这样,您可能已经在_config.yml中指定会话超时的设置实际上会受到尊重,并允许您注销在CMS中处于非活动状态的用户.同样,由于第一段中提到的原因,数据不应丢失.
您可以选择手动覆盖mysite / _config / config.yml中的会话超时值,以帮助确保它在某个明确的时间(例如,下面30分钟)实际到期:
# Set session timeout to 30min. Session: timeout: 1800
你可能会问:为什么这有必要?
因为,虽然阻止你将LeftAndMain.session_keepalive_ping设置覆盖为false的错误(或功能?)据说在framework PR #3272修复了,但实际上很快就会在PR #3275恢复
我希望这可以帮助其他人像我一样对这种情况感到困惑!
精彩评论