namdp06/ckfinder-4.0-fix-s3-iam-upload

为Laravel定制的CKFinder 4包,解决了使用IAM角色在S3上上传的问题

v1.0.0 2023-02-14 06:59 UTC

This package is auto-updated.

Last update: 2024-09-14 10:43:31 UTC


README

此仓库包含适用于Laravel 9+的CKFinder 4包。此仓库是从https://github.com/ckfinder/ckfinder-laravel-package分叉的。目的:修复从EC2使用IAM角色进行S3上传的问题

安装

  1. 添加Composer依赖项并安装包。

    namdp06/ckfinder-4.0-fix-s3-iam-upload
  2. 发布CKFinder连接器配置和资源。

    php artisan vendor:publish --tag=ckfinder-assets --tag=ckfinder-config

    这将发布CKFinder资源到public/js/ckfinder,并将CKFinder连接器配置发布到config/ckfinder.php

    如果您需要自定义路由名称、不同的资源位置、文件浏览器自定义等,您还可以发布此包使用的视图。

    php artisan vendor:publish --tag=ckfinder-views

    最后,您可以使用单个命令发布包的配置、资源和视图。

    php artisan vendor:publish --tag=ckfinder
  3. 为CKFinder文件创建一个目录并允许写入访问。默认情况下,CKFinder期望文件位于public/userfiles(这可以在配置中更改)。

    mkdir -m 777 public/userfiles

    注意:由于通常将权限设置为0777是不安全的,建议将目录的所有权更改为与Apache相同的用户,并添加组写权限。如有任何疑问,请联系系统管理员。

  4. CKFinder默认使用基于双重提交cookie的CSRF保护机制。在某些配置中,可能需要配置Laravel不加密CKFinder设置的cookie。

    为此,请将cookie名称ckCsrfToken添加到EncryptCookies中间件的$except属性中

    // app/Http/Middleware/EncryptCookies.php
    
    namespace App\Http\Middleware;
    
    use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
    
    class EncryptCookies extends Middleware
    {
        /**
         * The names of the cookies that should not be encrypted.
         *
         * @var array
         */
        protected $except = [
            'ckCsrfToken',
            // ...
        ];
    }

    您还应该禁用Laravel的CSRF保护,以便CKFinder的路径,因为CKFinder使用自己的CSRF保护机制。这可以通过将ckfinder/*模式添加到VerifyCsrfToken中间件的$except属性中完成:(app/Http/Middleware/VerifyCsrfToken.php)

    // app/Http/Middleware/VerifyCsrfToken.php
    
    namespace App\Http\Middleware;
    
    use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
    
    class VerifyCsrfToken extends Middleware
    {
        /**
         * The URIs that should be excluded from CSRF verification.
         *
         * @var array
         */
        protected $except = [
            'ckfinder/*',
            // ...
        ];
    }

此时,您应该在导航到<APP BASE URL>/ckfinder/connector?command=Init地址后看到连接器JSON响应。CKFinder的认证尚未配置,因此您将看到一个错误响应,表示CKFinder未启用。

配置认证

CKFinder连接器认证由中间件类或别名处理。要创建自定义中间件类,请使用Artisan命令

php artisan make:middleware CustomCKFinderAuth

新的中间件类将出现在app/Http/Middleware/CustomCKFinderAuth.php中。在config/ckfinder.php中更改authentication选项

$config['authentication'] = '\App\Http\Middleware\CustomCKFinderAuth';

CustomCKFinderAuth类中的handle方法允许对CKFinder用户进行认证。一个简单的实现(显然是不安全的)如下

public function handle($request, Closure $next)
{
    config(['ckfinder.authentication' => function() {
        return true;
    }]);
    return $next($request);
}

请参阅CKFinder for PHP连接器文档以了解更多关于此选项的信息。

注意:作为替代方案,您可以在config/ckfinder.php中设置配置选项$config['loadRoutes'] = false;。然后您将vendor/ckfinder/ckfinder-laravel-package/src/routes.php中的路由复制到您的应用程序路由(例如routes/web.php)中,以使用您的Laravel认证中间件进行保护。

Route::any('/ckfinder/connector', '\CKSource\CKFinderBridge\Controller\CKFinderController@requestAction')
    ->name('ckfinder_connector');

Route::any('/ckfinder/browser', '\CKSource\CKFinderBridge\Controller\CKFinderController@browserAction')
    ->name('ckfinder_browser');

配置选项

CKFinder 连接器配置是从 config/ckfinder.php 文件中获取的。

要了解更多可能的连接器配置选项,请参阅 CKFinder for PHP 连接器文档

用法

该包代码包含了一些使用示例,可能对您有帮助。要启用它们,请取消注释 vendor/ckfinder/ckfinder-laravel-package/src/routes.php 中的 ckfinder_examples 路由。

// vendor/ckfinder/ckfinder-laravel-package/src/routes.php

Route::any('/ckfinder/examples/{example?}', 'CKSource\CKFinderBridge\Controller\CKFinderController@examplesAction')
    ->name('ckfinder_examples');

之后,您可以导航到 <APP BASE URL>/ckfinder/examples 路径,查看可用示例列表。要了解背后的代码,请检查包中的 views/samples 目录(vendor/ckfinder/ckfinder-laravel-package/views/samples/)。

在模板中包含主 CKFinder JavaScript 文件

为了能够在网页上使用 CKFinder,您必须包含主 CKFinder JavaScript 文件。首选的做法是包含如下所示的 CKFinder 设置模板:

@include('ckfinder::setup')

包含的模板渲染所需的 script 标签并配置有效的连接器路径。

<script type="text/javascript" src="/js/ckfinder/ckfinder.js"></script>
<script>CKFinder.config( { connectorPath: '/ckfinder/connector' } );</script>

有用的链接