Laravel 提供更简单的方式来处理用户授权动作。类似用户认证,有 2 种主要方式来实现用户授权:gates 和策略,我这里主要讲解下策略的使用。

文档 上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。

例子:我这里准备用编辑文章授权来做演示,在这个权限中,只有文章所有者可以编辑,来体验一下 Policy 如何实现它。

 

准备工作

安装 laravel

composer create-project --prefer-dist laravel/laravel laravel-vue "5.5.*"

建表

php artisan make:migration posts --create=posts

Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string("title", 200);
$table->text("content");
$table->timestamps();
$table->index('user_id');
});

创建 Model

php artisan make:model PostModel

# app/PostModel.php
namespace App\Models; use Illuminate\Database\Eloquent\Model; class PostModel extends Model
{
protected $table = 'posts';
protected $fillable = ['title', 'content', 'user_id'];
}
 

生成策略

策略其实就是授权方案所对应的类文件,它在 app/Policies 目录下面,下面我用命令创建一个策略文件。

php artisan make:policy PostPolicy

命令执行完毕之后,会生成 app/Policies/PostPolicy.php 文件,下面我们开始编辑它。

# app/Policies/PostPolicy.php
namespace App\Policies; use App\User;
use App\PostModel;
use Illuminate\Auth\Access\HandlesAuthorization; class TopicPolicy
{
use HandlesAuthorization; public function create(User $user)
{
// code
} public function update(User $user, PostModel $postModel)
{
return $user->id === $postModel->user_id;
} public function delete(User $user, PostModel $postModel)
{
// code
}
}
 

注册策略

授权策略需要注册才能使用,在什么地方注册呢?laravel5.5 在 AuthServiceProvider 中包含一个 policies 的属性,这里面注册策略,下面我们看下如何注册。

# app/Providers/AuthServiceProvider.php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; user App\PostModel;
use App\Policies\PostPolicy; class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
PostModel::class => PostPolicy::class, // 注意在这里注册 policy
]; public function boot()
{
$this->registerPolicies();
}
}
 

使用策略

注册完毕之后,在 User 模型中有 can 和 cant 方法来使用策略,如在 PostController 编辑时使用:

# app/Http/Controllers/PostController.php

public function create() {
if (Auth::user()->can('create', PostModel)) { // 注意这里的用法
// 可以创建
} else {
// 无权限
}
} public function update(Request $request) {
$id = $request->input('id');
$post = PostModel::findOrFail($id);
if (Auth::user()->can('update', $post)) {
// 可以编辑
} else {
// 无编辑权限
}
}

如果你想超级管理员也拥有编辑权限的话,可以在定义策略的时候加上策略过滤器,也就是一个 before 方法:

# app/Policies/PostPolicy.php
public function before($user, $ability)
{
if ($user->isSuperAdmin()) {
return true;
}
} # app/User.php
public function isSuperAdmin()
{
// 定义ID为1为超级管理员
if ($this->id == 1) {
return true;
}
return false;
}

在 balde 模板中使用 @can 和 @cannot方法来判断

@can('create', App\PostModel::class)
<a href="">创建</a>
@endcan @can("update", $post)
<a href="">编辑</a>
@endcan

好了,这次就写到这里,希望此篇笔记能帮助到你。

Laravel policy 的应用的更多相关文章

  1. An Introduction to Laravel Policy

    An Introduction to Laravel Policy 30 Dec 2018 . Laravel. 7.6K views If you heard about Laravel Polic ...

  2. PHP and laravel知识点小小积累

    function () use ($x, &$y){} 自从PHP5.3开始有了closure/匿名函数的概念,在这里的use关键词的作用是允许匿名函数capture到父函数scope 内存在 ...

  3. Laravel 5.8: Automatic Policy Resolution

    Laravel 5.8: Automatic Policy Resolution March 26, 2019 One of the new features in Laravel 5.8 allow ...

  4. Laravel策略(Policy)示例

    场景:当前用户创建的订单,只能当前用户自己看,可以通过授权策略类(Policy)来实现 1.php artisan make:policy OrderPolicy 成功后,默认只有一个构造方法.因为涉 ...

  5. Laravel系列 目录结构

    Where Is The Models Directory? app directory by default 其中 app:,core code of your application, almos ...

  6. [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。

    1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...

  7. Laravel 5.1 ACL权限控制 二 之策略类

    随着应用逻辑越来越复杂,要处理的权限越来越多,将所有权限定义在AuthServiceProvider显然不是一个明智的做法,因此Laravel引入了策略类,策略类是一些原生的PHP类,和控制器基于资源 ...

  8. 关于laravel框架的跨域请求/jsonp请求的理解

    最近刚接触laravel框架,首先要写一个跨域的单点登录.被跨域的问题卡了两三天,主要是因为对跨域这快不了解,就在刚才有点茅塞顿开的感觉,我做一下大概整理,主要给一些刚接触摸不着头脑的看,哪里写得不对 ...

  9. laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

    第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...

随机推荐

  1. JMeter学习(三)元件的作用域与执行顺序(转载)

    转载自 http://www.cnblogs.com/yangxia-test 1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它 ...

  2. vue使用全局element-ui组件

    安装loader模块: cnpm install style-loader -D cnpm install css-loader -D cnpm install file-loader -D   安装 ...

  3. 第二章 向量(f)归并排序

  4. 缩点+出入度 poj1236

    题目链接:https://vjudge.net/contest/219056#problem/H 题意:先输入n,代表接下来有n个点,接下来n行,第i行里面的数(假设是)a,b...0(到0表示结束) ...

  5. Fraction to Recurring Decimal(STRING-TYPE CONVERTION)

    QUESTION Given two integers representing the numerator and denominator of a fraction, return the fra ...

  6. 100-days: Five

    Title: Feel better now ? The rise and rise of the anxiety economy(焦虑经济) rise and rise 一直上升 anxiety n ...

  7. stark组件之分页【模仿Django的admin】

    我们的stark组件用的我们的分页组件,没有重新写 下面直接看下分页的代码 class page_helper(): def __init__(self, count, current_page, p ...

  8. linux命令学习之:df

    df命令用于显示磁盘分区上的可使用的磁盘空间.默认显示单位为KB.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法 df (选项) (参数) 选项 -a或--all:包含全部 ...

  9. dup

    dup是一个操作符,由编译器识别处理,和db.dw.dd等数据定义伪指令配合使用,用来进行数据的重复. 例如 db  3  dup (0) 定义了3个字节,它们的值都是0,相当于db 0,0,0 db ...

  10. listView 滑动时 滑到一半自动滑动到对应的位置

    package com.bi.demo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; impo ...