Codeigniter 3.x、Ion-auth、CKFinder - 如何将登录状态从 ion-auth 传递到 CKFinder 的配置文件

Codeigniter 3.x, Ion-auth, CKFinder - how to pass the logged in status from ion-auth to CKFinder's config file

如何将登录状态从 ion-auth/codeigniter 传递到 CKFinder 的配置文件?

在CKfinder中,有一个认证配置文件如下:

$config['authentication'] = function () {
    return false;
};

在 codeigniter 中,我使用的是 ion-auth。在登录()方法的Auth控制器中,如果用户成功登录,我添加了这个:

$_SESSION['userloggedin'];

$_SESSION['userloggedin'] 确实设置为当我回显到屏幕时,我得到“1”,但回显在 login() 方法中。我似乎可以在 CKfinder 配置中获得会话变量。我该怎么做?我想做这样的事情:

$config['authentication'] = function () {
    if ($_SESSION['userloggedin'] === true) { 
        return true;
    } else {
        return false;
    }
};

感谢任何帮助。

您无法直接访问 $_SESSION,因为 CI 使用其自己的会话形式,通常以 __ci_vars 开头,并且没有简单的方法直接访问它们,除非您独立加载会话驱动程序,这是一整套蠕虫病毒。

我是这样实现的:

好的,所以我使用与您相同的东西 - CKFinder、IonAuth 等

index.php:

执行以下 $system_path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'system';$application_folder = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'application'; 这使得从任何地方调用时这些路径都是正确的。

接下来您的 index.php 文件创建一个名为 CI.php 的文件并添加以下内容:

<?php
ob_start();
define('REQUEST', 'external');
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . "index.php"; //or wherever the directory is relative to your path
ob_end_clean();
return $CI;

然后在您的默认路由控制器中(如果您转到本地主机或 somesite.com,则您的站点首先登陆的控制器)添加 index() 函数的顶部添加定义的 if 语句 - if如果你不这样做,你的默认路由将在 CK 中呈现,一切都将无法正常工作。

class Homepage extends MY_Frontend
{

    public function index()
    {
        // FOR SI AND CKFINDER
        if (defined('REQUEST') && REQUEST === 'external') {
            return;
        }

然后在你的 ck 配置中:

$CI = require_once $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'CI.php';


/* ============================ General Settings ======================================= */
// http://docs.cksource.com/ckfinder3-php/configuration.html

$config = array();

/* ============================ Enable PHP Connector HERE ============================== */
// http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_authentication

$config['authentication'] = function () {
    $CI = & get_instance();
    $CI->load->library('session'); //if it's not autoloaded in your CI setup
    return $CI->session->has_userdata('user_id');
};

我只是检查是否设置了会话 user_id 标志(TRUE 已登录,FALSE 未设置)因为我的前端控制器没有使用它(或会话),这就是 CK被路由通过。如果您的整个站点落后于 ion_auth 或者如果您自动加载它或会话比您可能只使用 return $this->ion_auth->logged_in();.

请记住,如果您使用 CSRF,那么 CK 也可能会受到影响并且无法工作,因为它没有正确的标记。

我在 CI 配置文件中执行以下操作:

if (defined('REQUEST') && REQUEST === 'external') {
    $config['csrf_protection'] = FALSE;
} else {
    $config['csrf_protection'] = TRUE;
}

这个解决方案并不优雅,但这是我发现的唯一有效的方法!有一些库可以从 CI 中加载 CK,但对于我使用的 CK 版本来说都太旧了。