Как интегрировать CKFinder с Laravel?

Я пытаюсь интегрировать CKFinder с Laravel, и у меня получается около 95%. Я могу заставить все работать, кроме функции CheckAuthentication — я должен сделать ее return true независимо от того, чтобы загрузка работала.

Что я пытался сделать, так это загрузить Laravel в файле config.php, а затем проверить, вошел ли пользователь в систему, как показано ниже:

public/packages/ckfinder/config.php

<?php
/*
 * ### CKFinder : Configuration File - Basic Instructions
 *
 * In a generic usage case, the following tasks must be done to configure
 * CKFinder:
 *     1. Check the $baseUrl and $baseDir variables;
 *     2. If available, paste your license key in the "LicenseKey" setting;
 *     3. Create the CheckAuthentication() function that enables CKFinder for authenticated users;
 *
 * Other settings may be left with their default values, or used to control
 * advanced features of CKFinder.
 */

/** RIPPED FROM public/index.php **/

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/

require __DIR__.'/../../../bootstrap/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let's turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight these users.
|
*/

$app = require __DIR__.'/../../../bootstrap/start.php';

/** END public/index.php **/

/**
 * This function must check the user session to be sure that he/she is
 * authorized to upload and access files in the File Browser.
 *
 * @return boolean
 */
function CheckAuthentication()
{
    // WARNING : DO NOT simply return "true". By doing so, you are allowing
    // "anyone" to upload and list the files in your server. You must implement
    // some kind of session validation here. Even something very simple as...

    return Auth::check();
}

Однако это всегда возвращает false. Я также пытался напрямую использовать Session Laravel, чтобы установить переменную в значение true, когда кто-то входит в систему, и false, когда они выходят из системы, а затем проверяя это в файле config.php, но он всегда возвращает значение по умолчанию в Session::get("IsAuthorized", false);. Может ли кто-нибудь предложить некоторые рекомендации относительно -

1) Как аутентифицировать, разрешено ли пользователю загружать?

2) Почему загрузка Laravel в другом файле заставляет его использовать отдельный сеанс, даже если он загружает одни и те же файлы?


person Goldentoa11    schedule 30.05.2014    source источник
comment
возможно, этот пост может вам помочь (forumsarchive.laravel.io/viewtopic.php?id=11909 )   -  person Razor    schedule 30.05.2014
comment
Проверьте официальный пакет CKFinder для Laravel 5.5+ — надеюсь, это упростит интеграцию.   -  person Anna Tomanek    schedule 31.07.2018


Ответы (2)


Я попытался интегрировать Filemanager и KCFinder от simogeo в проект Laravel и обнаружил ту же проблему.

С помощью этого кода можно поделиться сеансом Laravel и проверить аутентификацию из внешних проектов:

https://gist.github.com/frzsombor/ddd0e11f93885060ef35

person frzsombor    schedule 09.01.2015

По моему опыту, начиная с 4.1.28, Application::boot() больше не инициализирует конфиденциальные данные сеанса.

Поэтому, если вы интегрируете стороннюю библиотеку, которая требует внешней проверки аутентификации через сеансы, простая проверка Auth::check() не будет работать. Однако мы все еще можем использовать старую переменную $_SESSION.

Например. этот не будет работать:

require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/start.php';
$app->boot();
return Auth::check();

Переменные сеанса для работы Auth::check() инициализируются только в последовательности $app->run(). Но в этом случае произойдет маршрутизация и, возможно, вы получите нераспознанную страницу... если только вы не используете для этого специальный пакет Laravel.

Этот - ниже - все еще работает:

// Somewhere in your app - e.g. in filters.php, "auth"/"guest" filters declaration
if (session_id() == '') {
    @session_start();
    /* or Session:start(); */
}
$_SESSION['isLoggedIn'] = Auth::check() ? true : false;

Тогда в вашем случае функция будет простой:

function CheckAuthentication()
{
    if (session_id() == '') {
        @session_start();
    }
    return isset( $_SESSION['isLoggedIn'] ) && $_SESSION['isLoggedIn'] == true;
}

Н.Б. Если вы можете использовать вызовы Ajax для проверки авторизации, вы все равно можете создать собственный API с запросом JSON для регистрации пользователя (например), чтобы узнать, аутентифицирован ли пользователь.

Отвечая на ваш второй вопрос - это не так просто, как кажется. Laravel по умолчанию использует файловую систему для хранения сессий. Хотя данные сеанса все еще доступны, они зашифрованы - если вы не напишете свой собственный диспетчер сеансов, вы не сможете легко извлечь оттуда что-либо.

person YOzaz    schedule 09.06.2014
comment
На laravel5.3 можно? - person DMS-KH; 30.10.2016