Laravel用户授权系统的使用方法示例

前言

本文主要给大家介绍的是关于Laravel用户授权系统使用的相关内容

首先两个概念分清楚:

用户身份认证 Authentication - 处理用户登录, 退出, 注册, 找回密码, 重置密码, 用户邮箱认证 etc..

权限管理 Authorization - 负责 用户 与 权限, 用户组 三者之间的对应, 以及管理.

下面话不多说了,来一起看看详细的介绍吧

基本用法

示例

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

第一个参数 $ability,表示具备什么权限。第二个参数 $post,是一个模型实例。

不需指定模型的动作,比如 create,不需要指定的模型。第二个参数传一个类名。如:

$this->authorize('create', Post::class);

使用的场景有:控制器辅助方法,中间件,Blade模板,User 模型的 can 和 can't 方法。

authorize方法:

public function authorize($ability, $arguments = [])
{
 list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);

 return app(Gate::class)->authorize($ability, $arguments);
}

有两种方式实现用户授权

Gates

编写 Gates

一般在 app\Providers\AuthServiceProvider 的 boot 方法中定义。

Gate::define('update-post', function ($user, $post) {
 return $user->id == $post->user_id;
});

第一个参数是权限的名称,第二个参数是满足权限的条件,可以是闭包,控制器方法。

授权动作

allows 和 denies 两种方法,表示允许和否定。

第一个参数是权限的名称,第二个参数是模型,可以为空。这里不需要传入用户,框架会自动处理。

if (Gate::allows('update-post', $post)) {
 // 指定用户可以更新博客...
}

if (Gate::denies('update-post', $post)) {
 // 指定用户不能更新博客...
}

如果需要指定特定用户,可以使用 Gate Facade 中的 forUser 方法:

if (Gate::forUser($user)->allows('update-post', $post)) {
 // 指定用户可以更新博客...
}

if (Gate::forUser($user)->denies('update-post', $post)) {
 // 指定用户不能更新博客...
}

策略

生成策略

artisan 命令:

php artisan make:policy PostPolicy

也可以指定 model,生成包含 CURD 的策略方法。

注册策略

在 AuthServiceProvider 的 policies 属性,可以将模型和策略对应起来。如:

protected $policies = [
 Post::class => PostPolicy::class,
];

策略方法

public function update(User $user, Post $post)
{
 return $user->id === $post->user_id;
}

策略方法,就是权限名称,$this->authorize(‘update', $post) 的第一个参数就对应同名的策略方法,第二个参数 $post 代表它是一个 Post 模型,框架会根据参数判断采用 Post::class => PostPolicy::class 这个策略。

当 authorize 方法调用的时候,实际上会自动注入 User 和 Post 类型的两个参数,也因此使用授权系统必须是用户登录的情况下。

使用策略也不一定要和模型绑定,比如这样也可以:

protected $policies = [
 Travel::class => TravelPolicy::class,
 'aaa'=>TravelPolicy::class,
];

这个 aaa 字符串对应策略类为 TravelPolicy::class,在控制器使用 authorize 判断授权:

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

此时也是可行的,第二个参数这个时候就必须是字符串 aaa 了,然后 authorize 方法只会自动注入 User 参数。

官方文档

Laravel 5.5 文档

https://laravel-china.org/docs/laravel/5.5/authorization/1310

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Laravel多用户认证系统示例详解

    前言 自从Laravel5.2开始,自带的Auth认证系统可以支持多个角色认证了.就是说你比如果有管理员.普通用户这两种角色,都可以通过同一个Auth系统来实现认证. 本文将详细给大家介绍关于Laravel多用户认证系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. #1 自动生成代码 Laravel自带的Auth可以通过一行命令来生成相关的认证控制器.模版以及路由: php artisan make:auth 这样就会生成一个AuthController认证控制器

  • Laravel框架用户登陆身份验证实现方法详解

    本文实例讲述了Laravel框架用户登陆身份验证实现方法.分享给大家供大家参考,具体如下: laravel中检测用户是否登录,有以下的代码: if ( !Auth::guest() ) { return Redirect::to('/dashboard'); } 那Auth::guest是如何调用的呢? laravel用了Facade模式,相关门面类在laravel/framework/src/Illuminate/Support/Facades文件夹定义的,看下Auth类的定义: class

  • 通过修改Laravel Auth使用salt和password进行认证用户详解

    前言 本文主要给大家介绍了通过修改Laravel Auth用salt和password进行认证用户的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: Laraval自带的用户认证系统Auth非常强大易用,不过在Laravel的用户认证系统中用户注册.登录.找回密码这些模块中用到密码加密和认证算法时使用的都是bcrypt,而很多之前做的项目用户表里都是采用存储salt + password加密字符串的方式来记录用户的密码的,这就给使用Laravel框架来重构之前的项目带来了

  • 详解用vue.js和laravel实现微信授权登陆

    在laravel框架我们使用安正超的package 网址:https://easywechat.org/ 有专门的针对laravel的安装包,请参见如下网址:https://github.com/overtrue/laravel-wechat 下面来说说具体的安装: 1.安装package composer require overtrue/wechat 2.在app/config/app.php 中注册 ServiceProvider Overtrue\LaravelWechat\Servic

  • 基于Laravel实现的用户动态模块开发

    前言 相信大家都知道,几乎所有的社区应用都有用户动态这个部分,用户可以通过好友动态获能取到更多感兴趣的内容,从而提高社区活跃度和用户粘性.它的实现相对来讲比普通的内容发布要复杂一些,主要体现在内容多样性上. 为了解决这个问题,我们得把这些不同类型的内容抽象,提取共性,使用相同的结构来处理,开发起来就会简单很多. 概念抽象 用户动态,顾名思义,动态的产生,就是一系列事件的历史记录,所以首先关注"事件"这个名词,它有哪些属性: 触发者,基于社区所有的事件几乎都是由用户触发的 事件主体,事件

  • Laravel实现用户注册和登录

    Laravel身为最优雅的PHP框架,很多学习PHP的小伙伴造就对Laravel垂涎欲滴.今天就来实现你的愿望,让我们一起从零开始,利用Laravel实现Web应用最常见的注册和登录功能!所有的课程源码已放在Github上:laravel-start. Race Start ! 首先我们来明确一下我们这个课程需要的东西: Laravel 4.2 Bootstrap 3.3 Laravel就是我们关心的核心部分,Bootstrap用来快速设置一些前端的CSS样式. 1.安装Laravel 简单说明

  • Laravel 5框架学习之用户认证

    Laravel 出厂已经带有了用户认证系统,我们来看一下 routes.php,如果删除了,添加上: Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController' ]); 可以使用 php artisan route:list 查看一下.浏览器中访问 /auth/login,可以看到登陆界面,最好把系统默认的 app.blade.php 中关于 google 的东西注释

  • laravel5.2实现区分前后台用户登录的方法

    1.前台登录 直接使用laravel自带的auth php artisan make:auth 然后可以查看路由文件: Route::group(['middleware' => 'web'], function () { Route::auth(); Route::get('/home', 'HomeController@index'); }); 执行php artisan migrate 会发现生成了两张表. 2.后台登录 编辑配置文件 config\auth.php 添加guards中的a

  • Laravel重写用户登录简单示例

    本文实例讲述了Laravel重写用户登录的方法.分享给大家供大家参考,具体如下: class AuthController extends Controller { // use ThrottlesLogins, AuthenticatesAndRegistersUsers; protected $redirectTo = 'admin/index'; protected $loginView = 'admin/login'; protected $guard = 'admin'; protec

  • Laravel实现用户多字段认证的解决方法

    前言 本文主要给大家介绍了关于Laravel用户多字段认证的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 解决方案: 登录字段不超过两个的(简单的解决方案) 登录字段大于或等于三个的(相对复杂一些) 登录字段不超过两个的 我在网上看到一种相对简单解决方案,但是不能解决所有两个字段的验证: filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name' 过滤请求中的表单内容,

随机推荐