laracrafts/laravel-geo-routes

针对 Laravel 的地理定位限制路由

v0.3.0 2019-09-16 10:14 UTC

This package is auto-updated.

Last update: 2024-08-29 05:00:22 UTC


README

为 Laravel 提供地理定位限制路由

要求

  • Laravel 5.5 或更高版本
  • PHP 7.1 或更高版本

安装

通过终端或命令提示符导航到您的项目根目录,并执行以下命令

composer require laracrafts/laravel-geo-routes

注意:如果您正在使用 包发现,可以跳过服务提供者和别名的注册,因为它们会自动注册,但不要忘记按照下面的说明发布配置。

  • 注册服务提供者

打开您的 config/app.php 文件,并将以下条目添加到 providers 数组中

LaraCrafts\GeoRoutes\GeoRoutesServiceProvider::class,
  • 发布配置

仍在同一文件夹中,请在终端中执行以下命令

php artisan vendor:publish --provider="LaraCrafts\GeoRoutes\GeoRoutesServiceProvider"

用法

常规路由

要快速开始,allowFromdenyFrom 方法允许您根据 地理定位 限制对路由的访问

  • 允许来自特定地区的访问
Route::get('/home', 'FooController@bar')->allowFrom('us', 'gb');

上述示例的作用是只允许来自 美国英国 的访问 /home 路由。

或者我们可以这样做

Route::get('/home', 'FooController@bar')->from('us', 'gb')->allow();

默认情况下, 所有其他国家的用户将收到一个 HTTP 401 未授权错误,要更改此行为,您可以在回调部分中描述的回调中使用。

  • 拒绝来自特定地区的访问

在第二个示例中,我们将拒绝来自特定位置,例如:加拿大、德国和法国的访问。

Route::get('/home', 'FooController@bar')->denyFrom('ca', 'de', 'fr');

或者

Route::get('/home', 'FooController@bar')->from('ca', 'de', 'fr')->deny();

注意: 此包使用 ISO Alpha-2 国家代码。

注意: 此包使用stevebaumanlocation 包,请参阅其官方文档以获取有关如何正确配置的详细指南。

路由组

除了允许您控制对常规路由的访问之外,laravel-geo-routes 包还允许您定义路由组,并对其执行相同的技巧。

请考虑以下示例

Route::geo(['prefix' => '/en', function () {
    Route::get('/', 'HomeController@index');
    Route::get('/forums', 'ForumsController@index');
}])->allowFrom('dk', 'gb')->orRedirectTo('error');

注意:如您所注意到的,我们正在使用 geo 方法而不是默认的 group 方法,这将与 group 方法的行为相同,接受一个属性数组作为第一个参数和一个路由 闭包 作为第二个参数。

注意:只能在调用 geo 方法之后使用属性方法,因此您必须编写 Route::geo(...)->name('english.'); 而不是 Route::name('english.')->geo(...);

注意:除非使用 fromallowdenyallowFromdenyFrom 方法应用规则,否则将不会定义路由组。

手动配置

在底层,allowFromdenyFrom 方法在路由上设置了 geo 属性,该属性是一个包含以下参数的数组

  • 【数组】countries:受地理限制覆盖的国家列表。
  • 【字符串】strategy:确定是否允许或拒绝访问,值只能是允许拒绝
  • 【数组】callback(可选):访问被拒绝时将调用的回调及其参数。

因此,如果您更倾向于详细说明,您可以按照以下方式定义您的GeoRoutes

Route::get([ 'geo' => ['countries' => ['us', 'ca'], 'strategy' => 'allow', 'callback' => [$myCallback, $myArgs]] ], function() {
    //
});

您的GeoGroups也可以手动定义,如下例所示:

Route::group([ 'geo' => ['countries' => ['us', 'ca'], 'strategy' => 'allow', 'callback' => [$myCallback, $myArgs]] ], function() {
    //
});

回调函数

如前所述,未经授权用户的默认行为是返回HTTP 401 未授权错误响应,但您仍然可以通过使用回调来更改此行为。

要使用回调,您只需将->orCallback()添加到GeoRoute限制的末尾,如下所示:

Route::get('/forums', 'FooController@bar')
->allowFrom('de', 'ca')
->orCallback();

注意:您还可以与原生路由方法混合使用。

  • 默认回调

Laravel-geo-routes提供了一些有用的内置回调,以下将列出它们及其用例。

  • orNotFound

orNotFound回调将导致对未经授权的访问者返回HTTP 404未找到响应。

Route::get('/forums', 'FooController@bar')
->allowFrom('de', 'ca')
->orNotFound();
  • orRedirectTo

此回调接受一个必需参数,该参数必须是有效的路由名称。多亏了这个回调,您可以将未经授权的访问者重定向到您选择的路由。

Route::get('/forums', 'FooController@bar')
->allowFrom('de', 'ca')
->orRedirectTo('myRoute');
  • 自定义回调

上述回调可能不足以满足您的需求,因此您可能需要添加自定义回调。在此指南中,我们将介绍几种定义自定义回调的方法。

1. 使用类

  1. 创建一个新的类,例如CustomCallbacks
  2. 添加您想要添加的任意多的回调,但请确保所有方法都是static或您会遇到问题。
  3. 打开config/geo-routes.php配置文件,并将您的回调添加到回调数组中,如下所示:
'callbacks' => [
    'myCallback' => 'CustomCallbacks::myCallback',
    'anotherCallback' => 'CustomCallbacks::anotherCallback'
]

现在您的回调已就绪,您可以开始使用它们了:

Route::get('/forums', 'FooController@bar')
->allowFrom('ca', 'us')
->orMyCallback();

Route::get('/blog', 'FooController@baz')
->denyFrom('fr', 'es', 'ar')
->orAnotherCallback();

注意:我们已添加了or前缀并将回调名称转换为studly case(例如,myCallback被转换为orMyCallback),请务必注意此说明,因为它对于您的回调正常工作非常重要。

您还可以使用CallbackRegistrarparseCallbacks方法来加载这些回调。

示例

use LaraCrafts\GeoRoutes\Support\Facades\CallbackRegistrar;

public function boot()
{
    CallbackRegistrar::parseCallbacks(MyCallbacksClass::class);
}

2. 使用回调的array

loadCallbacks方法允许您加载一个回调的关联数组。

示例

use LaraCrafts\GeoRoutes\Support\Facades\CallbackRegistrar;

public function boot()
{
    $myCallbacksArray = [
        'handyName' => 'myClass::myCallback'
        //
    ]
    
    CallbackRegistrar::loadCallbacks($myCallbacksArray);
}

3. 使用callback方法

callback方法允许您添加一个单独的自定义回调,接受一个名称和一个可调用的函数。

示例

use LaraCrafts\GeoRoutes\Support\Facades\CallbackRegistrar;

public function boot()
{
    CallbackRegistrar::callback('foo', function () {
        return 'Sorry, you are not authorized.';
    });
}

Artisan命令

我们对route:list命令进行了调整,并添加了新选项,以便更容易地检索地理限制信息。以下是新选项及其用法示例列表:

贡献

欢迎对本项目的所有贡献,请参阅CONTRIBUTING.md文件以获取有关贡献指南的更多信息。

许可协议

版权所有(c)2019 LaraCrafts。

本产品受MIT许可协议许可,请参阅许可文件以获取更多信息。