总结
Auth中间件用于定义未登录用户只能操作哪些权限
policy授权策略定义了当前用户实例与进行授权的用户是否匹配,一致才能进一步操作,否则返回403禁止访问异常
场景:用户登录
Auth步骤

找到需要过滤动作的控制器,以中间件形式写入该类的构造方法中(或可在路由定义,在group by语句前)
except:未登录用户只能操作数组中的动作,其他均需要登录用户方可操作
only:未登录用户只能操作数组中的动作,其他均需要验证,常与guest搭配。例只允许guest未登录用户访问注册页,相当于已登录用户无法访问注册页。
友好转向:用户访问中间件动作中权限受阻时,会自动跳转到设定页面。可在RedirectIfAuthenticated.php设定redirect()跳转的页面
场景:用户只能编辑自己
Policy步骤

artisan生成 xxxxPolicy 策略文件
lara约定了 Policy字眼前的前缀名字为关联模型的命名,并自动引入该模型类命名空间。例如生成 UserPolicy策略, 类中会自动引入User模型类的命名空间
在app/policies中定义策略方法
定义方法,形参依赖注入 当前登录模型实例和进行授权用户实例的两个参数 例如 (User $$currentUser, User $user)
方法体写入判定条件 如 当前登录模型实例与授权用户实例的ID比较
在Providers/Auth/serviceProvider.php的$policies属性中定义授权策略与模型关联 ,
\App\Models\User::class => \App\Policies\UserPolicy::class,
在控制器中调用$this->authorize('update',$user)
第一 个参数对应的是授权类方法中定义的方法名。
第二个参数$user对应的是update授权方法的第二个参数(进行授权的用户实例)
简介
Laravel内置了一个中间件来验证用户的身份认证。如果用户没有通过身份认证,中间件会重定向到登录页面。但如果通过认证,则允许该请求更进一步进入。

可以将中间件想象为一系列HTTP请求必须经过才能触发应用的层。每一层都会检查请求(是否符合某些条件),如果不符合,甚至可以在请求访问之前完全拒绝。

1.必须先登录
在用户控制器中使用构造方法。

$this->middleware('auth',[
'except'=>['show','create','store']
]);

middleware方法接收两个参数:

第一个:中间件名称
第二个:要进行过滤的动作
其中该中间件还有两个动作

except设定指定动作,数组中的动作将不使用Auth中间件的过滤方法。相当于除了数组中指定动作以外,所有其他的动作都必须登录用户才能访问
only白名单,只允许访问数组中的动作
2.用户只能编辑自己的资料
当用户1尝试更新用户2的资料时,应弹出403 forbidden禁止访问异常。
在lara中可以使用policy对用户操作权限进行验证,未经授权进行的操作将会返回403

2.1新建一个授权策略类
$ php artisan make:polcy UserPolicy

新建的策略类将会安置在app/Policiies文件夹下。此处体现了【约定优于配置】

下面创建一个策略类

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

update方法接收两个参数,第一个参数默认为当前登录用户实例,第二参数则为要进行授权的用户实例。当两个id相同时,则代表两个用户是相同用户。若不同则抛除403异常信息拒绝访问。

使用授权时需要注意两个地方

并不需要检查$currentUser(当前登录用户实例)是否为null。框架会自动为其所有权限返回false
调用时,默认情况下,不需要传递当前登录用户到该方法内。框架会自动加载当前登录用户。
2.2授权关联
在AuthServiceProvider类中对授权策略进行设置。该文件包含一个policies属性,用于将各种模型对应到管理它们的授权策略上(相当于关联)。此处需要为模型指定UserPolicy

接下来,在protected 的policies属性中添加

\App\Models\User::class=>\App\Policies\UserPolicy::class

授权完毕后,可在控制器中使用authorize方法验证用户授权策略。默认的App\Http\Controllers\Controller类包含AuthorizesRequeststrait。该trait提供authorize方法,可以被用于快速授权指定行为。当无权限运行该行为时,会抛出HttpException。

authorize方法接收两个参数

第一个:授权策略名称(UserPolicy中的授权的update方法)
第二个:进行授权验证的数据(用户模型实例,即数据表中指定的字段)
//此处的update对应 UserPolicy的update授权方法
//$user对应的是update授权方法的第二参数。
$this->authorize('update',$user)

调用policy中的update方法时,默认情况下不需要传递第一个参数。当前登录用户($currentUser)登录时,框架会自动加载当前登录用户

在以下两处地方分别添加上授权策略验证

edit:当前登录用户尝试编辑时,调用策略类中的update,判断当前登录用户的id是否与模型实例中进行授权的id相同,若不是则无权访问
update同上
2.3友好转向
未登录用户尝试编辑资料,将会跳转到登录页面,如果用户再进行登录,则会重定向到个人中心页面上。
更好的体验,应该是将用户重定向到他之前尝试访问的页面。

redirect()实例提供了一个intended方法(尝试之意,用户尝试访问的域名).可将页面重定向到上一次请求尝试访问的页面上,并接收一个默认跳转地址参数,当上一次请求记录为空时,跳转到默认地址上。

常见场景,可在会话管理(登录管理)中添加intended方法,

2.4注册于登录页面访问限制
只让未登录用户访问登录页面和注册页面

sessionController:登录管理相关,只允许访客登录create(登录界面),相当设置已登录的用户无法访问登录页权限(此时会跳转到默认页,需调整)
UsersController:用户管理相关,只允许访客登录create(注册界面),
登录控制器/用户控制器:

$this->middleware('guest',[
//guest指未登录用户,访客
//only:可理解为白名单,指定一些只允许未登录用户访问的动作
'only'=>['create']
]);
2.5访问权限受阻返回页面
访问Auth定义的中间件权限受阻时,会被跳转到默认/home页面。此处需要修改中间件中的redirect()方法并加上友好提醒

文件:app/Http/Middleware/RedirectIfAuthenticated.php,此处的Auth关联Users控制器(中间件引入了该类)

session()->flash('info', '您已登录,无需再次操作。');
return redirect('/'); //默认重定向的页面

Laravel-权限系统的更多相关文章

  1. Entrust - Laravel 用户权限系统解决方案

    Zizaco/Entrust 是 Laravel 下 用户权限系统 的解决方案, 配合 用户身份认证 扩展包 Zizaco/confide 使用, 可以快速搭建出一套具备高扩展性的用户系统. Conf ...

  2. Entrust - Laravel 用户权限系统解决方案 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPHub

    说明# Zizaco/Entrust 是 Laravel 下 用户权限系统 的解决方案, 配合 用户身份认证 扩展包 Zizaco/confide 使用, 可以快速搭建出一套具备高扩展性的用户系统. ...

  3. phpcms中的RBAC权限系统

    PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...

  4. 基于资源的权限系统-API设计

    概述 权限系统需要和别的系统集成,因此,良好的API是易用性的保证. 这里只设计一些权限相关的核心 API,关于用户,组织,导入导出之类的后续再逐步补充 API 设计 围绕权限有以下 4 类 API: ...

  5. 高校手机签到系统——第一部分Authority权限系统(下)

    很抱歉,之前寝室光纤断了,所以到现在才更新这个系列的第二篇博客.点击访问高校手机签到系统——第一部分Authority权限系统(上) 这几天我反思了一下上一篇写博上的方式,一味的贴代码式的,是否应该更 ...

  6. ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 2、linux 如何修改只读文件 3、ubuntu安装

    1.ubuntu chmod 无法更改 文件夹权限 系统提示“不允许的操作 答案:需要超级用户权限 sudo 2.linux 如何修改只读文件 答案:可以使用chmod命令,为改文件提供其他的权限.u ...

  7. 以一个权限系统来告别WebForm —(一)项目整休架构设计与数据库设计

    在本节我想与大家与分享一下,我所将要做的权限系统的架构和数据库的表的设计.请各位大神们对我项目中设计的不足之处进行指导,让我得以更好的写完它,留给需要它的人. 我的项目架构如下图所示: 如上图所示,在 ...

  8. S2SH商用后台权限系统第二讲

    各位博友: 您好!我们今天接着上一讲继续学习S2SH商用后台权限系统,本讲我们重点设计下整个系统所需要的表结构. 用户表:记录用户信息. 角色表:标记用户归属的角色信息. 菜单表:或者叫模块表,记录整 ...

  9. S2SH商用后台权限系统第一讲

    各位博友: 您好!从今天开始我们做一套商用的权限系统.功能包含用户管理.角色管理.模块管理.权限管理.大家知道每个商用系统肯定会拥有一套后台系统,我们所讲的权限系统是整个系统核心部分.本套系统技术有s ...

  10. 权限系统与RBAC模型概述

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3793894.html ...

随机推荐

  1. 《JavaScript 模式》知识点小抄本(下)

    介绍 最近开始给自己每周订个学习任务,学习结果反馈为一篇文章的输出,做好学习记录. 这一周(02.25-03.03)我定的目标是<JavaScript 模式>的第七章学习一遍,学习结果的反 ...

  2. H5中被废弃的标签

    <br>换行,已经被<p>标签进行替换 <hr>画线 <font> <b>,<u>,<i>,<s>:加粗 ...

  3. 面试 3-5年Java开发后的感受

    在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...

  4. Winform中实现拖拽文件到ListView获取文件类型(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个for ...

  5. leetcode第一题两数之和击败了 98.11% 的用户的答案(C++)

    虽然题目简单,但我这好不容易优化到前2%,感觉也值得分享给大家(方法比较偷机) 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们 ...

  6. c++-构造函数练习和delete,new

    强化练习 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostr ...

  7. ArcGIS Runtime SDK for WPF学习笔记(一)

    本节主要讲解如何安装ArcGIS Runtime SDK,以及移除注释与水印. 附上ArcGIS Runtime SDK for .NET的官方操作手册网址:https://developers.ar ...

  8. 报错解决 unable to unroll loop, loop does not appear to terminate in a timely manner (994 iterations) or unrolled loop is too large, use the [unroll(n)] attribute to force an exact higher number

    在 Unity 写 Shader 的时候,在一个循环里面使用了 tex2D 函数,类似与下面这样: fixed2 center = fixed2(0.5,0.5); fixed2 uv = i.uv ...

  9. cinder安装与配置

    cinder是openstack中提供块存储服务的组件,主要是为虚拟机实例提供虚拟磁盘. 通过某种协议(SAS,SCSI,SAN,iSCSI等)挂接裸硬盘,然后分区.格式化创建的文件,或者直接使用裸硬 ...

  10. Eureka+SpringBoot2.X结合Security注册中心安全验证

    当我们直接配置完SpringCloudEureka的时候,任何人直接就可以访问,这样是极不安全的!!外网的情况下是绝对不允许的! 好在有提供了解决方案,下面拿为我们提供的Security解决 Spri ...