tecbeast / laravel-frontend-rights
一个针对 Laravel 5.1+ 的包,可以限制前端访问某些路由到一组角色。
这个包的官方仓库似乎已丢失,因此该包已被冻结。
Requires
- php: >=5.5.9
- laravel/framework: >=5.1.0
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调用,将路由作为资源,当您收到负面响应时,您可以选择重定向、显示错误或隐藏用户不允许看到的内容。