Laravel进阶系列笔记--(二十九)Laravel 用户授权之Gate快速使用
作者:温新
时间:2021-08-03
hi,我是温新,一-名PHPer。
本系列采用Laravel8.x演示。
除了优雅安全的用户认证外,Laravel还提供了用于对资源控制的权限。举个例子,自己只能修改自己发布的文章,而不能修改别人发布的文章。
Laravel提供了两种授权方法:Gate
和Policy
。
Gate
是基于闭包的方式进行授权,Policy
与控制器一样,在相关类中进行操作。对于这两种授权,可以结合使用。Gate
通常用于与模型或资源无关的权限验证,如后台管理;而Policy
则用于对指定模型或资源的动作进行授权。
本案例使用全新的Laravel项目演示记录。
第一步:安装laravel/ui
composer require laravel/ui
// 使用自带的脚手架系统
php artisan ui bootstrap --auth
php artisan ui bootstrap
npm install
npm run dev
访问register
并注册2个用户。
第二步:users表增加权限字段
1)手动为users
表新进role varchar(30)
字段
2)ID为1的用户role
值为admin
;ID为2的用户role
值为general
第三步:定义路由及页面
该页面只有管理员能够看到,普通用户无权查看
1)定义路由
// web.php
Route::get('admin', function(){
return view('admin');
});
2)新建页面
// resources/views/admin.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Dashboard') }}</div>
<div class="card-body">
<p>我是管理员页面,只有管理员才能看到我</p>
</div>
</div>
</div>
</div>
</div>
@endsection
后台中进行权限验证
第四步:定义权限
// App\Providers\AuthServiceProvider.php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
public function boot()
{
$this->registerPolicies();
// 定义访问权限
Gate::define('admin-access', function(){
// 判断当前用户角色是否为admin
if (Auth::user()->role === 'admin') {
return true;
}
return false;
});
}
第四步:判断权限
修改路由
// web.php
Route::get('admin', function(){
// 判断当前用户是否具有访问权限
if (Gate::allows('admin-access', Auth::user())) {
return view('admin');
}
// 无访问权限返回404
abort(404);
});
前端进行权限验证
需求:路由中有一个amdin
路由,目的就是把它挂到导航栏中,且只有管理员登录才能会这个路由栏目。
第五步:新增一个导航栏
// views/layouts/app.blade.php
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
@else
<li class="nav-item">
<a class="nav-link" href="{{ url('admin') }}">管理栏目</a>
</li>
@endguest
</ul>
</div>
这个千万不要复制,而要找到对应的位置,把
管理栏目
加入进去。
添加完成后,无论是管理员还是普通用户登录后都能看到管理栏目
这个导航,下面要做的就是只有管理员登录才能看到。
第六步:前端权限控制
// views/layouts/app.blade.php
@can('admin-access', auth()->user())
<li class="nav-item">
<a class="nav-link" href="{{ url('admin') }}">管理栏目</a>
</li>
@endcan
这样就完成了。
我是温新
每天进步一点点,就一点点
请登录后再评论