php laravel 权限,Laravel 权限控制 Gate Policy

这篇文章主要介绍了关于Laravel 权限控制 Gate Policy,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

关于权限

本质 针对一段可执行的逻辑单元描述是否开启生产的判断。

定义 必定有一用户实例或唯一标识参数,以及与之关联的使用资源。通常使用闭包或函数或方法

使用 调用权限逻辑单元句柄,参数 权限操作对象,用户信息。

源起

最基本的权限控制,三元运算符 ?:。很显然条件判断,后面跳到相应的执行逻辑。

laravel的思路是将执行逻辑(生产代码),授权(条件判断逻辑)进行分离。重点关注条件的产生,通俗讲强化授权逻辑(这对复杂的授权十分有用)。公设:所有的代码在服务注册完毕后,启动。所以下面这段代码会被注册。其目的是找到真正授权判断的逻辑体。Gate::define('update articles', 'ArticlePolicy@update')

其中第一个参数显然只是一个授权标识符(用来调用的句柄参数),第二个参数才为授权的逻辑执行体。

laravel授权定义

在 AuthServiceProvider 的 boot 方法里定义授权Gate::define('update articles', function ($user, $article) {

return $user->id == $article->user_id;

});

Gate::define('update articles', 'ArticlePolicy@edit');<?php

namespace App\Policies;

use App\User;

use App\Models\Article;

class ArticlePolicy

{

public function update(User $user, Article $article)

{

return $user->id == $article->author_id;

}

}

laravel授权使用Gate 门面:Gate::allows('update articles', $article) 和 Gate::denies('update articles', $article)。

Controller 引入了

traitAuthorizesRequests

$this->authorize('update articles', $article)。

Blade 模板:@can('update articles', $article) 和 @cannot('update articles', $article) 指令。

User Model 实例:$user->can('update articles', $article) 和 $user->cannot('update articles', $article)。

Laravel Policy

为了方便地定义和使用授权,Laravel 在Gate的基础上引入了 Policy。policy内部的每一个方法,都会被用gate::define方法的描述注册。所以这就是为什么使用了策略类注册之后,即便没有用Gate门面定义授权逻辑,在控制器内仍然可以使用Gate::allow('策略类方法')的形式来进行授权判断 。

在 AuthServiceProvider 的 policies 数组属性里先定义授权映射关系/**

* The policy mappings for the application.

*

* @var array

*/

protected $policies = [

Article::class => ArticlePolicy::class,

];<?php

namespace App\Policies;

use App\User;

use App\Models\Article;

use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy

{

use HandlesAuthorization;

public function create(User $user)

{

return true;

}

public function delete(User $user, Article $article)

{

return $user->id == $article->author_id;

}

public function before($user, $ability)

{

if($user->isSuperAdmin()){

return true;

}

}

}

注意:

Policy 只是在普通 PHP 类基础上添加了一个 HandlesAuthorization trait。

在 Policy 中会在所有方法执行前调用,经常用到的地方就是处理管理员授权逻辑。

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Laravel 提供了一些内置的功能来实现权限管理,包括: 1. 中间件(middleware):可以在请求到达控制器之前拦截请求并对用户进行权限验证。 2. 授权(authorization):可以在控制器中使用 `Gate` 或 `Policy` 类来判断用户是否有权限执行某个操作。 3. 角色(role):可以为用户分配角色,然后根据角色来判断用户是否有权限执行某个操作。 下面是一个简单的例子,演示如何使用中间件和授权来实现权限管理: 1. 创建一个中间件 `CheckPermission`: ```php php artisan make:middleware CheckPermission ``` ```php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class CheckPermission { public function handle($request, Closure $next, $permission) { $user = Auth::user(); if (!$user->hasPermission($permission)) { abort(403, 'Unauthorized action.'); } return $next($request); } } ``` 2. 在 `app/Http/Kernel.php` 文件中注册中间件: ```php protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'permission' => \App\Http\Middleware\CheckPermission::class, ]; ``` 3. 在路由中使用中间件: ```php Route::get('/dashboard', function () { // })->middleware(['auth', 'permission:access_dashboard']); ``` 4. 创建一个授权策略 `DashboardPolicy`: ```php php artisan make:policy DashboardPolicy ``` ```php <?php namespace App\Policies; use App\User; use Illuminate\Auth\Access\HandlesAuthorization; class DashboardPolicy { use HandlesAuthorization; public function access(User $user) { return $user->hasPermission('access_dashboard'); } } ``` 5. 在控制器中使用授权策略: ```php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; class DashboardController extends Controller { public function index() { // 使用 Gate 类 if (Gate::denies('access', auth()->user())) { abort(403, 'Unauthorized action.'); } // 使用 Policy 类 $this->authorize('access', auth()->user()); return view('dashboard'); } } ``` 这些都是 Laravel 中实现权限管理的基本方法,具体实现方式可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值