如何在SilverStripe 3.1.x中停用一段时间后使管理员会话失效?是否有配置选项?
我搜索并找到了以下代码段,当放在 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分钟不活动后,管理员用户仍然登录,会话没有超时。
答案 0 :(得分:3)
对于像我这样的人仍然在寻找解决方案,这是一个更简单的选择。事实证明,目前唯一的好解决方案确实是禁用LeftAndMain.session_keepalive_ping
,simon_w的解决方案因为ping而无法正常工作。此外,禁用此ping 不应导致数据丢失(至少不适用于SilverStripe 3.3+),因为用户在尝试提交工作时将会看到覆盖。验证完凭证后,他们的数据将照常提交给服务器。
此外,对于那些(像我一样)正在寻找解决方案的人来说,如果使用LeftAndMain.session_keepalive_ping
_config.yml
继续阅读,请通过mysite/_config.php
覆盖CMS ping。
简单修复:在您的// Disable back-end AJAX calls to /Security/ping
Config::inst()->update('LeftAndMain', 'session_keepalive_ping', false);
中,只需添加:
_config.yml
这将阻止CMS刷新会话,该会话将在幕后自然过期(并且不会在下一个请求时提交)。这样,您mysite/_config/config.yml
指示会话超时的设置实际上将受到尊重,并允许您注销在CMS中处于非活动状态的用户。同样,由于第一段中提到的原因,数据不应该丢失。
您可以选择手动覆盖# Set session timeout to 30min.
Session:
timeout: 1800
中的会话超时值,以帮助确保它在某个明确的时间(例如,下面30分钟)实际到期:
LeftAndMain.session_keepalive_ping
您可能会问:为什么这有必要?
因为虽然错误(或功能?)阻止您将{{1}}设置覆盖为假,但是framework PR #3272已经修复了PR #3275
我希望这可以帮助其他人像我一样对这种情况感到困惑!
答案 1 :(得分:2)
这很有效,但很想听听核心开发人员是否这是最佳做法。
在 mysite / code 中,我使用以下代码创建了一个名为 MyLeftAndMainExtension.php 的文件:
<?php
class MyLeftAndMainExtension extends Extension {
public function onAfterInit() {
self::logoutInactiveUser();
}
public static function logoutInactiveUser() {
$inactivityLimit = 1; // in Minutes - deliberately set to 1 minute for testing
$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();
Controller::curr()->redirect(Director::baseURL() . 'Security/login');
}
}
Session::set('session_start_time', time());
}
}
然后我将以下行添加到 mysite / _config.php
LeftAndMain::add_extension('MyLeftAndMainExtension');
这似乎可以解决问题。如果你喜欢通过yml,你可以将它添加到 mysite / _config / config.yml :
LeftAndMain:
extensions:
- MyLeftAndMainExtension
答案 2 :(得分:1)
Session.timeout
配置选项可用于设置会话的非活动超时。但是,将其设置为大于5分钟的任何内容都无法在开箱即用的CMS中运行。
在CMS中超时并不高效,您的内容管理员最终会破坏超时。这是因为在CMS中活动是可能的(并且相当常见),而从服务器的角度看是非活动的(比如说,你正在写一篇冗长的文章)。因此,CMS旨在每隔5分钟将ping发送回服务器以确保用户已登录。虽然您可以通过将LeftAndMain.session_keepalive_ping
配置选项设置为false
来阻止此行为,但我强烈反对建议不要这样做。