scaleplan / access-to-files
使用 Redis、PHP 和 Nginx 缓存文件
Requires
- php: >=7.2
- scaleplan/redis-singleton: dev-master
This package is auto-updated.
Last update: 2024-09-16 19:03:35 UTC
README
控制对私有文件的访问。
安装
composer require scaleplan/access-to-files
工作原理
假设我们需要向当前授权用户授予对 document.pdf 文件 1 小时和 picture.jpg 文件 5 分钟的访问权限。这些文件默认情况下对该用户不可访问。
首先,执行以下代码
//First file
AccessToFiles::getInstance(3600)->addFiles(['document.pdf']);
//The second file
AccessToFiles::getInstance(300)->addFiles(['picture.jpg']);
在这部分,我们创建了两个 AccessToFiles 对象 - 一个用于打开 1 小时的访问权限,另一个用于打开 5 分钟的访问权限。然后,将文件添加到每个对象中。
AccessToFiles 类总是为访问时间创建一个实例,这意味着如果在上述代码之后执行以下操作
$af = AccessToFiles::getInstance(3600);
则不会创建新对象,而只会返回上述创建的对象,供 1 小时的文件使用。
为了为每个实例打开文件访问,必须执行 allowFiles 方法
AccessToFiles::getInstance(3600)->allowFiles();
AccessToFiles::getInstance(300)->allowFiles();
此方法将有关文件(文件类型、时长、对谁)的元数据写入元数据存储库,默认情况下是 Redis。
现在,如果同一用户访问这些文件,他们将能够访问,但在经过指定的时长间隔(1 小时和 5 分钟)后,文件将再次不可用。
对于临时打开的文件的返回,nginx 的 lua 脚本响应,该脚本可以爬入 Redis b 检查是否有请求的文件的记录,如果有,则提供该文件。
lua 脚本如何确定用户?
当写入文件元数据时, AccessToFiles 使用 指纹 方法,尝试收集尽可能多的关于当前用户的数据,以便其用户不会被混淆。
默认情况下,只使用会话标识符,但在会话被盗的情况下也可以使用 HTTP 头部。
注意: 存储在项目中的 lua 脚本只与默认的识别设置兼容,即如果只使用会话标识符,则需要进行一些小的改进才能扩展该集合。