kaiquegarcia/lumen-nginx-secure-link

特性,轻松将 Lumen/Laravel 项目适配使用 NGINX 安全链接

v0.1-alpha 2021-02-04 15:48 UTC

This package is auto-updated.

Last update: 2024-09-05 01:42:00 UTC


README

特性,轻松将 Lumen/Laravel 项目适配使用 NGINX 安全链接

安装 & 设置

使用 composer 在您的 Lumen/Laravel 项目中安装此包;

Laravel / Lumen 设置

  1. NGINX_SECURE_LINK_SECRETNGINX_SECURE_LINK_TTL 添加到您的 .env 文件;
  2. 运行 php artisan vendor:publish --provider="Nginx\SecureLink\Providers\SecureLinkServiceProvider"
  3. 运行 php artisan config:clear

Nginx 设置

您需要为每个要保留签名的路由创建一个配置。在设置任何配置之前,请记住编译源代码或运行 apt get install nginx-extras

NGINX 配置(使用示例 https://yourdomain.com/signed-route/file.zip

        location /signed-route/ {
                secure_link $arg_md5,$arg_expires;
                secure_link_md5 "$secure_link_expires$uri$remote_addr NGINX_SECURE_LINK_SECRET";

                if ($secure_link = "") { return 403; }
                if ($secure_link = "0") { return 410; }

        }

解释这些环境变量

  1. NGINX_SECURE_LINK_SECRET 是后端中要保留的“密码”。您必须在环境文件和每个 nginx 配置中放置它;
  2. NGINX_SECURE_LINK_TTL 是生成的 secure_link 过期的时间(秒)。

如何使用

use \Nginx\SecureLink\Traits\WithSecureLink 添加到您的 Eloquent 模型中,并假设原始属性名为 link,您就准备好了。例如

模型实现

class ModelExample extends \Illuminate\Database\Eloquent\Model
{
  use \Nginx\SecureLink\Traits\WithSecureLink;
  protected $fillable = ['link'];
}

使用方法

$example = new ModelExample();
$secure_link = $example->secure_link;

自定义原始属性

您可以也应该有机会根据其他模型属性创建安全链接。为此,只需重写受保护的属性 $secure_link_origin_attribute。例如

模型实现

class ModelExample extends \Illuminate\Database\Eloquent\Model
{
  use \Nginx\SecureLink\Traits\WithSecureLink;
  protected $fillable = ['my_custom_url'];
  protected $secure_link_origin_attribute = 'my_custom_url';
}

自定义 IP 提供者

由于此项目是为 Lumen 框架制作的,因此在尝试捕获用户客户端 IP 时可能会出现一些失败。原因是我们在使用类 Illuminate\Http\Request 来访问 ip 方法。如果您在此处遇到任何问题,您可以通过具有相同方法的任何类来开发它,并重写受保护的属性 $secure_link_ip_class_provider。例如

IP 提供者实现

class IpProvider extends \Illuminate\Http\Request
{
  public function ip()
  {
    return "the-right-ip";
  }
}

模型实现

class ModelExample extends \Illuminate\Database\Eloquent\Model
{
  use \Nginx\SecureLink\Traits\WithSecureLink;
  protected $fillable = ['link'];
  protected $secure_link_ip_class_provider = IpProvider::class;
}