Laravel进阶系列笔记--(二十九)Laravel 用户授权之Gate快速使用

作者: 温新

分类: 【Laravel】

阅读: 2096

时间: 2021-09-02 11:21:52

作者:温新

时间:2021-08-03

hi,我是温新,一-名PHPer。

本系列采用Laravel8.x演示。

除了优雅安全的用户认证外,Laravel还提供了用于对资源控制的权限。举个例子,自己只能修改自己发布的文章,而不能修改别人发布的文章。

Laravel提供了两种授权方法:GatePolicy

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

这样就完成了。

我是温新

每天进步一点点,就一点点

请登录后再评论