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);
// 更新文章...
}