Laravel policy 的应用
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 的应用的更多相关文章
- An Introduction to Laravel Policy
An Introduction to Laravel Policy 30 Dec 2018 . Laravel. 7.6K views If you heard about Laravel Polic ...
- PHP and laravel知识点小小积累
function () use ($x, &$y){} 自从PHP5.3开始有了closure/匿名函数的概念,在这里的use关键词的作用是允许匿名函数capture到父函数scope 内存在 ...
- 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 ...
- Laravel策略(Policy)示例
场景:当前用户创建的订单,只能当前用户自己看,可以通过授权策略类(Policy)来实现 1.php artisan make:policy OrderPolicy 成功后,默认只有一个构造方法.因为涉 ...
- Laravel系列 目录结构
Where Is The Models Directory? app directory by default 其中 app:,core code of your application, almos ...
- [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。
1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...
- Laravel 5.1 ACL权限控制 二 之策略类
随着应用逻辑越来越复杂,要处理的权限越来越多,将所有权限定义在AuthServiceProvider显然不是一个明智的做法,因此Laravel引入了策略类,策略类是一些原生的PHP类,和控制器基于资源 ...
- 关于laravel框架的跨域请求/jsonp请求的理解
最近刚接触laravel框架,首先要写一个跨域的单点登录.被跨域的问题卡了两三天,主要是因为对跨域这快不了解,就在刚才有点茅塞顿开的感觉,我做一下大概整理,主要给一些刚接触摸不着头脑的看,哪里写得不对 ...
- laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证
第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...
随机推荐
- MySQL 事务 隔离级别
前两天面试,问到了四种隔离级别,当时觉得大多数数据库都为read committed,结果没想到mysql是个例外.在此做一下隔离级别和各种数据库锁的使用. 首先说一下ACID四大特性: 四大特性 ...
- OWAPSP_ZAP使用
启动OWAPSP_ZAP后 netstat -pantu | grep 8080
- python 函数的动态参数 命名空间,作用域以及函数嵌套,global和nonlocal (重点)
*** 坚持坚持,即使你不太强*** 1.函数的动态传参 2.函数的命名空间及作用域 3.函数嵌套 4.global和nonlocal关键字 一.函数的动态传参 1. *args: 位置参数动态传参, ...
- python websocket网页实时显示远程服务器日志信息
功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...
- Python之逻辑回归模型来预测
建立一个逻辑回归模型来预测一个学生是否被录取. import numpy as np import pandas as pd import matplotlib.pyplot as plt impor ...
- roof
roof - 必应词典 美[ruf]英[ruːf] n.屋顶:车顶:顶部:有…顶的 v.给…盖顶:盖上屋顶 网络房顶:楼顶:屋脊 变形复数:roofs:过去分词:roofed:现在分词:roofing ...
- const和volatile分析
c语言中const修饰的变量是只读的,不能直接作为赋值号的左值,其本质还是变量:会占用内存空间:本质上const在编译器有用,运行时无用(还是可以通过指针改变它的值) ; int *p=&ab ...
- CentOS常用的文件操作命令总结
我可以说是linux操作新手,有些命令经常忘记,特别是对文件的某些操作,经常要翻阅之前的笔记,今天把之前在百度上整理的“CentOS常用的文件操作命令”转载到我的新博客上面,以供后面查阅! 博客后面还 ...
- [剑指Offer]62-圆圈中最后剩下的数(约瑟夫环问题)(法二待做)
题目链接 https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6?tpId=13&tqId=11199&t ...
- swift4.2 - 一个自定义view弹框
import UIKit /* * 注册协议view:没找到 UI原图,咱不实现 */ class JYRegisterProtocolView: UIView { /// 点击同意协议的回调 pri ...