tecbeast/laravel-frontend-rights

一个针对 Laravel 5.1+ 的包,可以限制前端访问某些路由到一组角色。

这个包的官方仓库似乎已丢失,因此该包已被冻结。

2.0.0 2018-03-15 12:31 UTC

This package is auto-updated.

Last update: 2021-11-07 12:44:48 UTC


README

一个针对 Laravel 5.1+ 的包,可以限制某些资源(例如路由)仅允许拥有正确权限(角色/策略等)的用户通过 API(例如,用于 AJAX 调用)访问。对于单页应用程序或前端路由访问验证非常有用。

安装

使用 composer 安装

composer require tecbeast/laravel-frontend-rights

将服务提供者添加到 config/app.php 中的 providers 数组

'providers' => [

    ...

    TecBeast\FrontendRights\FrontendRightsServiceProvider::class,

],

⚠️ 如果你有通配路由,你需要在应用程序的 RouteServiceProvider 之前放置服务提供者。否则,路由将不可访问。

将配置发布到你的应用程序

php artisan vendor:publish --provider="TecBeast\FrontendRights\FrontendRightsServiceProvider"

配置

您可以在 config/frontend-rights.php 中配置配置文件。

restricted_access

一个关联数组,包含用户允许访问的资源(例如路由)及其相关权限(角色/策略)。键是资源的名称,值是允许的策略数组。

'restricted_access' => [
    'resource' => ['authorization1', 'authorization2'],
],

您还可以指定策略所属的模型。'acl' 的值是策略中的函数名称,'model' 的值是模型类

'restricted_access' => [
    'show-user' => [['acl' => 'showModel', 'model' => App\User::class]],
],

route

应用程序将用来访问控制器的基本路由。

'route' => '/api/v2/resource/access',

middleware

一个数组,包含上述路由将使用的中间件或中间件组(如果不需要中间件,则可以留空)。

'middleware' => [
    'api'
],

default_model

如果没有指定模型,策略可以找到的模型。

'default_model' => App\User:class

default_property

访问数据库中的模型时使用的默认属性(可以由请求参数覆盖)

'default_property' => 'id'

使用方法

为要使用的类创建策略(默认为 User 类):(https://laravel.net.cn/docs/5.4/authorization#creating-policies)

在你的策略中,函数的名称应与在 restricted_access 中分配给资源的名称相同

'restricted_access' => [
    'restricted-route' => ['admin'],
],

UserPolicy(或您的 User 类的相应策略)将具有以下函数

public function admin(User $user)
{
    return $user->isAdmin;
}

要检查用户是否有权访问资源,您可以向 config/frontend-rights.php 中指定的路由发送一个 POST 请求

https://website.com/api/v2/resource/access

带有资源参数,其名称是要检查的资源

resource = 'restricted-route'

使用捆绑资源

您还可以通过将资源(而不是资源)作为数组发送来捆绑多个资源

resources = [{ resource: 'restricted-route'}, { resource: 'other-route'}]

响应

响应将是一个包含所有已检查资源的数组

[{ data: true, status: 200}, { data: false, status: 200}, { data: { exception: 'SomeException', message: '....', trace: ..., line: 10}, status: 500 }]

如果访问被允许,数据将是true(例如,如果用户是管理员)。如果访问被拒绝,数据将是false(例如,用户不是管理员)。如果抛出异常,数据将是一个包含异常、消息、跟踪等的对象。

然后在您的前端中,您可以解析值并确定要执行的操作。

只有列入restricted_access的资源才会受到限制(其他所有资源返回"true"),就像一个带有步骤的黑名单(只需要一个返回true即可访问)。

使用其他模型类

要使用来自另一个模型策略的功能,您可以在数组中指定它

'restricted_access' => [
    'email.create' => [['acl' => 'create', 'model' => App\Email::class]],
],

这将使用EmailPolicy中的'create'函数,如下所示:

public function create(User $user)
{
    return $user->isAdmin;
}

具有模型的政策方法

要使用需要从数据库中检索模型的政策,例如更新电子邮件

'restricted_access' => [
    'email.update' => [['acl' => 'update', 'model' => App\Email:class]],
],

要使用模型的实例而不是类,则POST参数还期望一个值和一个属性(可选:属性默认为id)

resource = 'email.update'
property = 'id'
value = 1

现在,EmailPolicy中的'update'函数将使用从数据库中找到的电子邮件被调用。

异常

如果没有找到模型,将抛出'Illuminate\Database\Eloquent\ModelNotFoundException'。如果找到多个模型,将抛出'TecBeast\FrontendRights\Exceptions\TooManyModelsException'。

SPA示例

SPA的一个示例是当您导航到新页面或只想在页面上显示某些内容时。然后您可以发送一个AJAX调用,将路由作为资源,当您收到负面响应时,您可以选择重定向、显示错误或隐藏用户不允许看到的内容。