laravel

laravel 之用户授权使用讲解

2018-05-08  本文已影响15人  空气KQ

版本

laravel5.2

应用场景

控制对资源的访问权限,这个权限不同于RBAC(角色的权限访问控制),
比如,只能操作自己的信息,可以说是拟补RBAC的更加细腻的权限。

使用方法

1、AuthServiceProvider直接定义

/*
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
这里个$gate 是这个 Illuminate\Contracts\Auth\Access\Gate的注入依赖实例,
可以查阅他们的方法。
下面定义了,update-post的权限名字,匿名函数返回真假来定义这个是否有权限
$post表示文章的实力
*/
$gate->define('update-post', function ($user, $post) {
          return $user->id === $post->user_id;
});

Gate方法,文件\vendor\laravel\framework\src\Illuminate\Auth\Access\Gate.php


image.png

2、创建策略类

//文件生成位于:app/Policies
php artisan make:policy PostPolicy

添加AuthServiceProvider策略里面

//一定要引入命名空间
use App\Policies\PostPolicy;
use App\Model\Post;
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
         Post::class => PostPolicy::class,//这里哦
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @param  \Illuminate\Contracts\Auth\Access\Gate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        
        $this->registerPolicies($gate);
        
        //
    }
}

编写策略类

<?php

namespace App\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;
//命名空间,需要引入
use App\User;
use App\Model\Post;
class PostPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
   //这里写你的逻辑,
   public function update(User $user, Post $post)
   {

       return $user->id === $post->user_id;
   }
}

以上策略类可以写很多个,一个类对应一个策略类
例如创建一个博客的类

php artisan make:policy BlogPolicy
php artisan make:model Model/Blog


namespace App\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;
use App\User;
use App\Model\Blog;
class BlogPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    public function update(User $user, Blog $post)
    {

        return $user->id === $post->user_id;
    }
}

//调用检查

$blog=Blog::findOrFail(1);
echo Gate::check('update',[$blog]);

多个个同时使用是不会冲突的

public function index(Request $request){
        $user=Auth::loginUsingId(1);
        //Auth::logout();
        //print_r($user->toArray());

        $blog=Blog::findOrFail(1);
        echo Gate::check('update',[$blog]);
        //$user=User::find(1);
        $post = Post::findOrFail(1);
        if (Gate::denies('update', $post)) {
            abort(403,'不能操作其他人的信息');
        }
       print_r($user->toArray());

    }

3、调用

调用

 $post = Post::findOrFail(5);
//直接的。
 if (Gate::denies('update-post', $post)) {
     abort(403,'不能操作其他人的信息');
}
//使用策略类调用
$post = Post::findOrFail(1);
if (Gate::denies('update', $post)) {
      abort(403,'不能操作其他人的信息');
}

通过 User 模型调用,can ,cannot(或写成cant),3个函数

public function update(Request $request, $id)
    {
        $post = Post::findOrFail($id);
        //$request->user()取得当前用户认证的实例,
        if ($request->user()->cannot('update-post', $post)) {
            abort(403);
        }

        // 更新文章...
    }

视图调用

@can('update-post', $post)
    <!-- The Current User Can Update The Post -->
@else
    <!-- The Current User Can't Update The Post -->
@endcan

为指定用户检查权限是否可以访问

//$user是其他用户实例
$post = Post::findOrFail(4);
$user=User::find(1);
if (!Gate::forUser($user)->allows('update-post', $post)) {
            abort(403,' no go');
}

abort函数使用,第一个参数是状态吗,第二个参数是信息,第三个头部信息。
模版信息取得错误,可以使用{{ $exception->getMessage() }}

控制器使用,使用 $this->authorize,

方法来源:namespace Illuminate\Foundation\Auth\Access;

<?php

namespace App\Http\Controllers;

use App\Post;
use App\Http\Controllers\Controller;

class PostController extends Controller{
    /**
     * 更新给定文章
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id)
    {
        $post = Post::findOrFail($id);

        $this->authorize('update', $post);

        // 更新文章...
    }
}

授权非当前用户:
$this->authorizeForUser($user, 'update', $post);

自动判断策略类方法

被授权的权限将会自动基于调用的方法名进行判断

public function update($id){
    $post = Post::findOrFail($id);

    $this->authorize($post);

    // 更新文章...
}
上一篇下一篇

猜你喜欢

热点阅读