laravel policy用户授权

关于laravel的用户授权

(一)定义策略类

//我们以文章授权为例 判断用户是否有用修改和删除权限
php artisan make:policy PostsPolicy

运行会生成一个文件夹 (Policies文件夹)

这里写图片描述

(二)注册策略类和模型关系

注册策略类,找到 AuthServiceProvider.php,编写如下
protected $policies = [
    'App\Posts' => 'App\Policies\PostPolicy'
];
绑定模型关系,打开 PostPolicy.php 文件,添加两个方法,首先引入 User 模型 和 Posts 模型
//用户修改文章权限 返回一个bool类型
public function update(User $user, Posts $post)
{
    return $user->id == $post->user_id;
}

//删除文章权限
public function delete(User $user, Posts $post)
{
    return $user->id == $post->user_id;
}

(三)策略判断

我们可以在编辑文章前判断该用户是否有权限,比如下面是我们文章的编辑和删除方法,我们加入授权验证

//编辑逻辑
    public function update(Posts $post)
    {
        //验证
        $this->validate(\request(),[
           'title' => 'required|string|min:5|max:100',
           'content' => 'required|string|min:10'
        ]);

        //验证授权
        $this->authorize('update', $post);

        //逻辑
        $post->title = \request('title');
        $post->content = \request('content');
        $post->save();

        //渲染
        return redirect("/posts/{$post->id}");
    }

这样操作会报错,如果用户没有权限编辑和删除的话提交之后会报一个错误! This action is unauthorized. 就是没有权限,我们可以搭配 @can@endcan 来根据用户是否拥有权限,然后把编辑和删除按钮显示和隐藏,就可避免这个错误提示。

在模板中将按钮根据权限来区分显示和隐藏
<div style="display:inline-flex">
     <h2 class="blog-post-title">{{ $post->title }}</h2>
     @can('update', $post)
     <a style="margin: auto" href="/posts/{{ $post->id }}/edit">
         <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
     </a>
     @endcan
     @can('delete', $post)
     <a style="margin: auto" href="/posts/{{ $post->id }}/delete">
         <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
     </a>
     @endcan
</div>
@can@endcan 就等同于原生代码中的
//管理员权限
$admin_power = 'xx用户id';
<div style="display:inline-flex">
     <h2 class="blog-post-title">{{ $post->title }}</h2>
     <?php if ($admin_power) { ?>
     <a style="margin: auto" href="/posts/{{ $post->id }}/edit">
         <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
     </a>
     <?php } ?>
     <?php if ($admin_power) { ?>
     <a style="margin: auto" href="/posts/{{ $post->id }}/delete">
         <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
     </a>
     <?php } ?>
</div>

这样就实现了一个用户授权的过程

  • 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、付费专栏及课程。

余额充值