如何在不活动一段时间后在SilverStripe 3.1.x中注销管理员?

时间:2014-06-11 08:51:14

标签: security session-timeout silverstripe

如何在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分钟不活动后,管理员用户仍然登录,会话没有超时。

3 个答案:

答案 0 :(得分:3)

对于像我这样的人仍然在寻找解决方案,这是一个更简单的选择。事实证明,目前唯一的好解决方案确实是禁用LeftAndMain.session_keepalive_pingsimon_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来阻止此行为,但我强烈反对建议不要这样做。