tzm/authorizator

这是一个易于使用、功能强大且可扩展的Laravel包,通过自定义渠道授权用户操作。

v1.0.8 2020-06-08 12:11 UTC

This package is auto-updated.

Last update: 2024-09-09 03:26:34 UTC


README

stable PHP from Packagist Laravel version GitHub issues

这是一个易于使用、经过测试、功能强大且可扩展的Laravel包,通过自定义渠道授权用户操作。它通过向用户发送授权代码(例如通过短信或电子邮件)并进行验证来实现。

您可以配置任意多的渠道。每个操作都可以提供任何渠道配置。包含Blade模板和VUE组件。

使用此包,您可以通过自定义代码交付渠道(例如SMS、电子邮件等)定义如下独立操作:两步验证、删除账户、授权交易等。

animated_demo

使用示例

  • 两步验证,
  • 授权用户数据更改,
  • 确认交易,
  • 确认删除账户,
  • 确认电话号码,
  • 需要通过电子邮件、短信、语音电话等单独渠道进行用户授权的任何其他操作。

目录

安装

通过composer添加包

composer require tzm/authorizator

要了解如何配置此包,请访问如何使用部分

如何工作

包的流程图如下所示

flowchart

  1. 如果用户提供的操作需要额外的授权,将显示表单。 用户必须已登录(当然,您可以实现自己的逻辑)。
  2. 用户选择渠道(每个操作都可以有自己的渠道,默认情况下,您可以使用一个或多个渠道)。
  3. 生成代码并通过指定渠道发送给用户。
  4. 用户输入代码。
  5. 在代码验证成功后,执行自定义操作。

详细工作原理

要了解包的工作流程,让我们深入了解。

需要提供 Tzm\Authorizator\Service\AuthorizatorActionTzm\Authorizator\Service\AuthorizatorChannels\Channel 的两种类型的类。第一个类负责处理授权的给定操作。在这个类中,您将设置在成功验证授权代码后要执行的操作。这个类还包含验证后的返回路径、代码时间过期和允许的渠道信息。第二个类提供代码交付渠道,如电子邮件、短信等。它包含一个将授权代码发送给用户的方法。这两个都可以通过Artisan命令创建。

php artisan authorizator:make-action
php artisan authorizator:make-channel

开箱即用的包包含vue组件。此组件包含所有表单和方法。有两个端点:authorization/sendauthorization/check(两者都使用POST方法)。这些端点位于Tzm\Authorizator\Controller\AuthorizationController中。还有一个authorization/create端点,但我们将稍后讨论。

在请求授权的控制器中(或任何其他位置,如中间件等),会在数据库中创建新的授权。这是通过执行静态方法 Transaction::createAuth() 实现的。Transaction 对象扩展了 Tzm\Authorizator\Service\AuthorizatorAction 类。同时,新的变量存储在用户会话中(默认名称为 _authorizator_uuid,并包含数据库中的 uuid)。接下来,通过 response() 方法将视图返回给用户。因此,控制器看起来很简单。

use App\Services\AuthorizationActions\Transaction;

class TransactionController extends Controller
{
    public function create()
    {
        return Transaction::createAuth()->response();
    }
}

注意: Transaction 类继承自 Tzm\Authorizator\Service\AuthorizatorAction

您还可以指定响应类型(Blade 视图或 HTTP 响应代码)。基本上,您可以将属性 $shouldReturnView 设置为 false 以接收响应代码 201,或者可以使用 setResponseAsView(bool $shouldReturnView) 方法。

在 Vue 组件中,用户可以选择配送渠道(如果有多个)。请求通过 POST 方法发送到 authorization/send 端点。

接下来,通过从 Tzm\Authorizator\Service\AuthorizatorChannel\Channel 继承的 sendMessage() 方法将代码发送给用户。这是通过 authorization/send 端点完成的。

用户将此代码输入到表单中。如果代码有效(通过 authorization/check 端点),它将被设置为数据库中的已使用(列 verified_at 设置为当前时间)。最后,执行从继承的 Tzm\Authorizator\Service\AuthorizatorAction 类的 afterAuthorization()。这是此包中最重要的操作。在此方法中,您将编写在代码成功验证后运行的代码。

通过POST方法创建授权

如果您的应用程序需要通过 POST 方法创建新的授权代码,您可以使用 authorization/create 端点。在您的 POST 请求中,您必须添加一个名为 class 的参数,其中包含扩展 AuthorizatorAction 的类的名称。

如何使用

准备工作

注意!

默认情况下,此包使用 Vue 组件,但如果您不想使用 Vue.js 作为前端框架,您可以创建自己的表单处理程序。

要使用处理授权的 Vue 组件,在 app.js 包的 .vue 文件中声明。

Vue.component('authorizator-form', require('../../vendor/tzm/authorizator/src/resources/js/components/AuthorizatorForm').default);

别忘了运行 npm run watch 以生成资产!

注意,您的应用程序需要使用 Vue.js:[https://laravel.net.cn/docs/master/frontend#writing-vue-components](https://laravel.net.cn/docs/master/frontend#writing-vue-components)。

自定义 部分中了解更多有关自定义包的信息。

创建代码交付渠道

您可以通过 Artisan 命令添加示例通道类。

php artisan authorizator:make-channel

此类将出现在 app\Authorizator\Channels 文件夹中。

请注意,通道类必须扩展 Tzm\Authorizator\Service\AuthorizatorChannels\Channel 抽象类,否则将抛出 AuthorizatorException

此类需要三个方法

  • getChannelDescription() - 将生成当前通道的描述,例如,可以由本地化 .json 文件生成。它将在通道选择表单的无线电标签中显示。
  • getChannelName() - 返回通道名称。如果有多个通道,它将显示。
  • sendMessage(User $user, $code) - 此方法提供代码发送给用户。在此方法中,您将处理代码如何发送给用户。例如,如果您想通过电子邮件发送代码,可以使用 Laravel 邮件外观:Mail::to($user)->send(new SendAuthorizationCode($code))

创建授权操作

通过 Artisan 命令创建新的操作

php artisan authorizator:make-action

此类将出现在 app\Authorizator\Actions 文件夹中。

类必须声明方法 afterAuthorization()。此方法将在授权成功后调用,例如执行货币转账。通过 getAuthorizationModel() 您可以访问您的 Authorization 模型。最后,您必须定义包含将分配给此操作的代码发送通道类名称的数组 $allowedChannels,例如。

protected $allowedChannels = [
    EmailChannel::class,
    SmsChannel::class,
];

此外,您可以在$expiresInMinutes属性中设置代码过期时间(它将存储在数据库中)和在$returnRoute返回路由(在授权成功后执行)中。如果您想生成自定义代码,则覆盖generateCode()方法。

注意,如果您的应用实现的User模型不在App\User的命名空间中,您可以覆盖AuthorizatorAction::getUser()方法。

创建视图模板

该包的视图只包含一个带有vue组件的表单

<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Authorization</div>
                <div class="card-body">
                    <authorizator-form
                        allowed_channels="{{ json_encode($allowedChannels) }}"
                    >
                        You have to verify this action.
                    </authorizator-form>
                </div>
            </div>
        </div>
    </div>
</div>

因此,要在您的应用程序中实现它,您必须将其发布

php artisan vendor:publish --tag=authorizator.views

最后,您可以扩展此视图以用于主模板。别担心,此视图已通过名称初始化在AuthorizatorProvider中,因此不需要更多操作。

使其工作

最后,我们有了所有必需的元素:投递通道类、操作类、Blade视图和生成的vue组件。现在是设置它们的时候了。

创建一个示例控制器

use App\Services\AuthorizationActions\Transaction;

class TransactionController extends Controller
{
    public function create()
    {
        return Transaction::createAuth()->response();
    }
}

让我们分析一下代码。

Transaction类扩展了Tzm\Authorizator\Service\AuthorizatorAction类。

在公共控制器的方法create()中,执行了Transaction::createAuth()方法。这将向数据库中插入数据并将uuid设置在会话中。下一个方法通过returnView()返回默认的Blade视图。就是这样!

现在用户可以看到表单并选择授权代码投递通道。验证后,将执行Transaction类的afterAuthorization()方法。

工作示例在此处可用:https://github.com/zmudzinski/authorizator-example

立即发送代码

如果您想创建授权并发送代码(例如控制器)立即(例如控制器)发送,您可以使用AuthorizatorAction类中的sendCode()方法。

例如。

VerifyPhoneAction::createAuth()->sendCode(SmsChannel::class)

这将创建授权并通过给定的通道(在这种情况下为SmsChannel)发送代码

自定义

此包的所有元素都是可定制的。

迁移

您可以通过以下方式覆盖迁移

php artisan vendor:publish --tag=authorizator.migrations

路由

默认情况下,包路由由authweb中间件保护。它们在包routes.php文件中定义。您可以通过php artisan vendor:publish --tag=authorizator.routes来覆盖它们。然后您必须在新路由文件中注册新路由。在RouteServiceProvider类中添加以下方法:

protected function mapAuthorizatorRoutes(){
    Route::middleware('web')
        ->namespace($this->namespace)
        ->group(base_path('routes/authorizator.php'));
}

然后在map()方法中通过$this->mapAuthorizatorRoutes();调用它。

    public function map()
    {
        //...
        $this->mapAuthorizatorRoutes();
    }

接下来,在config/app.php中,您必须更改providers数组中的顺序。\Tzm\Authorizator\AuthorizatorProvider::class必须在App\Providers\RouteServiceProvider::class之前。

最后,您必须将新端点传递给vue组件的prop

<authorizator-form
        :allowed-channels='{!! json_encode($allowedChannels) !!}'
        send-endpoint="/new/path/to/send/code"
        verify-endpoint="/new/path/to/verify/code"
>
    You have to verify this action.
</authorizator-form>

Blade视图

默认Blade视图位于resource\views文件夹中。您必须发布此视图以将其扩展到主视图

php artisan vendor:publish --tag=authorizator.views

Blade视图使用默认的Bootstrap框架。

返回HTTP代码而不是Blade视图

有时您需要只返回HTTP响应代码而不是Blade视图(例如,如果您正在使用端点生成授权)。为此,将属性$shouldReturnView添加到您的操作中,并将其设置为false。这将返回带有代码201的HTTP响应而不是Blade视图。

vue组件

Vue组件在Blade视图中使用。它负责处理整个授权。您可以使用自己的vue组件。使用

php artisan vendor:publish --tag=authorizator.vue

接下来,您必须更新app.js中组件的声明。

注意!没有需要使用vue框架。如果您愿意,可以按您想要的方式处理表单。

本地化

所有PHP字符串都是可翻译的。您需要做的只是创建一个位于resource/lang文件夹中的语言文件,例如pl.json,内容如下

{
    "Code invalid": "Podany kod jest nieprawidłowy"
}

如果您想翻译来自AuthorizationForm.vue的字符串,您可以将翻译后的props传递给组件。

删除过期代码

要删除数据库中的所有过期代码,只需使用Artisan命令

php artisan authorizator:purge 

贡献

  1. 分支它
  2. 创建您的功能分支:git checkout -b my-new-feature
  3. 提交您的更改:git commit -am '我的新功能'
  4. 推送到分支:git push origin my-new-feature
  5. 提交拉取请求

反馈

如果您有任何问题或问题,请随时联系我们。

许可证

麻省理工学院