注意: 本教程涵盖了 CKFinder 初始化的基础知识,并未解释如何设置更复杂的项目。有关更详细的配置选项,请参阅类参考。
本节介绍如何通过代码配置连接器,这允许对配置进行动态更改。如果您希望通过静态配置文件配置连接器,请参阅 配置。
注意: 如果 CKFinder 是使用 ZIP 包安装的,您可以在 App_Data/ConnectorConfig.cs
文件中定义您的动态配置。此文件具有特殊用途,不需要手动编译 - 这里定义的配置将在运行时进行编译和应用。
构建连接器
CKFinder 连接器可以使用 ConnectorBuilder 类构建。
最重要的是 ConnectorBuilder 类中的 SetRequestConfiguration 方法,它定义了每个请求的配置。在这里您可以添加后端、资源类型和 ACL 规则。
注意: 一个有效的连接器需要至少一个后端、资源类型和 ACL 规则。
另一个需要为正确的连接器设置调用的方法是 SetAuthenticator。CKFinder 库不提供 IAuthenticator 的任何实现。请参阅 添加身份验证器 获取身份验证器的描述。
基本设置可能如下所示
public ConnectorBuilder ConfigureConnector()
{
var connectorBuilder = new ConnectorBuilder();
connectorBuilder
.SetRequestConfiguration(
(request, config) =>
{
config.AddProxyBackend("local", new LocalStorage(@"MyFiles"));
config.AddResourceType("Files", resourceBuilder => resourceBuilder.SetBackend("local", "files"));
config.AddAclRule(new AclRule(
new StringMatcher("*"), new StringMatcher("/"), new StringMatcher("*"),
new Dictionary<Permission, PermissionType>
{
{ Permission.FolderView, PermissionType.Allow },
{ Permission.FolderCreate, PermissionType.Allow },
{ Permission.FolderRename, PermissionType.Allow },
{ Permission.FolderDelete, PermissionType.Allow },
{ Permission.FileView, PermissionType.Allow },
{ Permission.FileCreate, PermissionType.Allow },
{ Permission.FileRename, PermissionType.Allow },
{ Permission.FileDelete, PermissionType.Allow },
{ Permission.ImageResize, PermissionType.Allow },
{ Permission.ImageResizeCustom, PermissionType.Allow }
}));
})
.SetAuthenticator(new MyAuthenticator());
return connectorBuilder;
}
此设置为每个请求添加以下项目
- 名为
local
的后端,带有 LocalStorage 适配器。
- 名为
Files
的资源类型,使用 local
后端和 files
根目录。
- 一个 ACL 规则,它为所有资源类型和所有路径的每个人授予所有权限。
此外,该示例还将 MyAuthenticator
作为所有请求的身份验证器。
添加身份验证器
CKFinder 需要知道其用户。您需要实现 IAuthenticator 接口来通知 CKFinder 哪些用户被允许访问该接口以及他们的角色是什么。
一个非常简单的实现,它允许所有用户访问,并且不定义任何角色,可能如下所示
public class MyAuthenticator : IAuthenticator
{
public Task<IUser> AuthenticateAsync(ICommandRequest commandRequest, CancellationToken cancellationToken)
{
var user = new User(true, null);
return Task.FromResult((IUser)user);
}
}
您可以在此接口的实现中使用 ICommandRequest.Principal 获取当前请求中的主体。 AuthenticateAsync 方法是异步的,因此在里面进行 IO 操作是安全的。但是,请记住,此方法针对每个请求调用,可能会影响 CKFinder 的整体性能。
最后步骤
当您定义了您的 connectorBuilder
后,就该构建连接器并在您的管道中使用它了。Build 方法接受 IConnectorFactory 的实现。目前,CKFinder 库只提供一个连接器工厂:OwinConnectorFactory,用于与 Owin 管道一起使用。
您 Owin 的 Startup
类的 Configuration
方法的最简单实现可能如下所示
public void Configuration(IAppBuilder appBuilder)
{
var connectorBuilder = ConfigureConnector();
var connector = connectorBuilder.Build(new OwinConnectorFactory());
appBuilder.Map("/CKFinder/connector", builder => builder.UseConnector(connector));
}
注意: 映射的路径 (/CKFinder/connector
) 是 CKFinder 的 JavaScript 部分期望找到连接器的位置。如果您想将连接器映射到不同的路由,请将其与 CKFinder JavaScript 客户端 connectorPath 保持同步。
自托管应用程序示例
先决条件
- 创建一个使用 .NET framework 4.5 或更高版本的空
控制台应用程序
项目。
- 安装以下 NuGet 包
代码
将您的 Program.cs
代码替换为以下内容
namespace Example
{
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using CKSource.CKFinder.Connector.Core;
using CKSource.CKFinder.Connector.Core.Acl;
using CKSource.CKFinder.Connector.Core.Authentication;
using CKSource.CKFinder.Connector.Core.Builders;
using CKSource.CKFinder.Connector.Host.Owin;
using CKSource.FileSystem.Local;
using Microsoft.Owin.FileSystems;
using Microsoft.Owin.Hosting;
using Microsoft.Owin.StaticFiles;
using Microsoft.Owin.StaticFiles.ContentTypes;
using Owin;
public class Program
{
/*
* 带有 JSON 支持的自定义内容提供程序。
*/
private class MyContentTypeProvider : FileExtensionContentTypeProvider
{
public MyContentTypeProvider()
{
Mappings.Add(".json", "application/json");
}
}
/*
* 允许所有用户访问且不定义任何角色的简单身份验证器。
*/
private class MyAuthenticator : IAuthenticator
{
public Task<IUser> AuthenticateAsync(ICommandRequest commandRequest, CancellationToken cancellationToken)
{
var user = new User(true, null);
return Task.FromResult((IUser)user);
}
}
/*
* 应用程序入口点。
*/
public static void Main(string[] args)
{
var program = new Program();
/* 在 https://127.0.0.1:9000 路径下运行应用程序。 */
WebApp.Start("https://127.0.0.1:9000", program.Configuration);
Console.ReadKey();
}
/*
* 连接器的简单配置。
*/
public ConnectorBuilder ConfigureConnector()
{
var connectorBuilder = new ConnectorBuilder();
connectorBuilder
.SetRequestConfiguration(
(request, config) =>
{
/* 添加本地后端。 */
config.AddProxyBackend("local", new LocalStorage(@"MyFiles"));
/* 添加使用本地后端的资源类型。 */
config.AddResourceType("Files", resourceBuilder => resourceBuilder.SetBackend("local", "files"));
/* 为所有用户授予对任何路径的所有资源类型的完全访问权限。 */
config.AddAclRule(new AclRule(
new StringMatcher("*"), new StringMatcher("/"), new StringMatcher("*"),
new Dictionary<Permission, PermissionType>
{
{ Permission.FolderView, PermissionType.Allow },
{ Permission.FolderCreate, PermissionType.Allow },
{ Permission.FolderRename, PermissionType.Allow },
{ Permission.FolderDelete, PermissionType.Allow },
{ Permission.FileView, PermissionType.Allow },
{ Permission.FileCreate, PermissionType.Allow },
{ Permission.FileRename, PermissionType.Allow },
{ Permission.FileDelete, PermissionType.Allow },
{ Permission.ImageResize, PermissionType.Allow },
{ Permission.ImageResizeCustom, PermissionType.Allow }
}));
});
/* 设置身份验证器。 */
connectorBuilder.SetAuthenticator(new MyAuthenticator());
return connectorBuilder;
}
/*
* Owin 配置。
*/
public void Configuration(IAppBuilder appBuilder)
{
/* 配置连接器构建器。 */
var connectorBuilder = ConfigureConnector();
/* 构建连接器中间件。 */
var connector = connectorBuilder.Build(new OwinConnectorFactory());
/* 将连接器中间件映射到 /CKFinder/connector 路由。 */
appBuilder.Map("/CKFinder/connector", builder => builder.UseConnector(connector));
/* 配置对 JavaScript 文件的本地文件的访问。 */
var options = new FileServerOptions();
options.StaticFileOptions.ContentTypeProvider = new MyContentTypeProvider();
options.FileSystem = new PhysicalFileSystem("../../CKFinderScripts");
/* 在根路径映射本地文件。 */
appBuilder.UseFileServer(options);
}
}
}
注意: 此示例在 https://127.0.0.1:9000
路径下运行。您可能需要具有提升的权限或使用 netsh add useracl shell 命令为您的用户保留此路径。