【问题标题】:How can I logout an administrator in SilverStripe 3.1.x after period of inactivity?我如何在 SilverStripe 3.1.x 中在一段时间不活动后注销管理员?
【发布时间】:2014-06-11 08:51:13
【问题描述】:

如何在 SilverStripe 3.1.x 中闲置一段时间后使管理员会话过期?是否有此配置选项?

我搜了一下,发现如下代码sn-p,放在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 分钟不活动后,管理员用户仍处于登录状态且会话未超时。

【问题讨论】:

  • 管理区域不会使用/调用您的控制器,因此永远不会调用 init() 方法。也许对于 CMS,你可以在 canView 钩子或类似的东西中实现一些东西,但不确定这是最好的解决方案......
  • 我正在尝试创建一个扩展,为 CMSMain 类添加一个附加方法。以前从未这样做过,但如果可行,我会在此处发布解决方案。

标签: security session-timeout silverstripe


【解决方案1】:

对于像我这样仍在寻找解决方案的人来说,有一个更简单的替代方案。事实证明,目前唯一好的解决方案确实是禁用 LeftAndMain.session_keepalive_pingsimon_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 中恢复

我希望这可以帮助像我一样对这种情况感到困惑的其他人!

【讨论】:

    【解决方案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
    

    【讨论】:

    • 嗯...这个解决方案让普华永道感到满意——他们对其进行了测试并将这个中等风险的缺陷标记为“已关闭”。如果管理员用户 30 分钟不活动(显然,在最终解决方案中,我在上面的示例中将不活动限制更改为 30),那么作为安全措施,他们会自动注销。
    【解决方案3】:

    Session.timeout 配置选项可用于设置会话的不活动超时。但是,将其设置为大于 5 分钟的时间在 CMS 中开箱即用是行不通的。

    在 CMS 中设置超时是没有效率的,您的内容管理员最终会因超时而失败。这是因为有可能(并且相当普遍)在 CMS 中处于活动状态,而从服务器的角度来看却显得不活动(例如,您正在写一篇冗长的文章)。因此,CMS 设计为每 5 分钟向服务器发送一次 ping,以确保用户登录。虽然您可以通过将 LeftAndMain.session_keepalive_ping 配置选项设置为 false 来阻止此行为,但我强烈建议不要这样做.

    【讨论】:

    • 如果我按照自己的方式行事,我会保持原样 - 我同意你的观点,这对我来说已经足够了,但是,由于客户端安全扫描,我不得不解决这个问题普华永道 - 他们将此标记为中等风险的安全问题。他们的建议是在 30 分钟不活动后超时管理会话。在这件事上我别无选择。感谢您抽出宝贵时间回答我的问题,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 2013-09-23
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多