香港高速VIP云机房火爆上线啦!无需备案,开通即用!配套《巅云自助建站系统3.0》将带给您飞一般的可视化拖拽建站体验,欢迎免费体验。

建站专题

Laravel中的Auth模块详解

一佰互联网站开发设计(www.yinxi.net) 发布日期 2019-04-26 09:01:52 浏览数: 138

前言

本文主要给大家介绍的是关于Laravel中Auth模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

本文是基于Laravel 5.4 版本的本地化模块代码进行分析书写;

模块组成

Auth模块从功能上分为用户认证和权限管理两个部分;从文件组成上,IlluminateAuthPasswords目录下是密码重置或忘记密码处理的小模块,IlluminateAuth是负责用户认证和权限管理的模块,IlluminateFoundationAuth提供了登录、修改密码、重置密码等一系统列具体逻辑实现;

下图展示了Auth模块各个文件的关系,并进行简要说明;

用户认证

HTTP本身是无状态,通常在系统交互的过程中,使用账号或者Token标识来确定认证用户;

配置文件解读

return [ "defaults" => [ "guard" => "web", ... ], "guards" => [  "web" => [  "driver" => "session",  "provider" => "users", ], "api" => [   "driver" => "token",   "provider" => "users", ], ], "providers" => [ "users" => [  "driver" => "eloquent",  "model" => AppUser::class, ],  ],], ];

从下往上,理解;

  • providers是提供用户数据的接口,要标注驱动对象和目标对象;此处,键名users是一套provider的名字,采用eloquent驱动,modal是AppUser::class;
  • guards部分针对认证管理部分进行配置;有两种认证方式,一种叫web,还有一种是api;web认证是基于Session交互,根据sessionId获取用户id,在users这个provider查询出此用户;api认证是基于token值交互,也采用users这个provider;
  • defaults项显示默认使用web认证;

认证

Session绑定认证信息:

// $credentials数组存放认证条件,比如邮箱或者用户名、密码// $remember 表示是否要记住,生成 `remember_token`public function attempt(array $credentials = [], $remember = false)  public function login(AuthenticatableContract $user, $remember = false) public function loginUsingId($id, $remember = false)

HTTP基本认证,认证信息放在请求头部;后面的请求访问通过sessionId;

public function basic($field = "email", $extraConditions = [])

只在当前会话中认证,session中不记录认证信息:

public function once(array $credentials = [])public function onceUsingId($id)public function onceBasic($field = "email", $extraConditions = [])

认证过程中(包括注册、忘记密码),定义的事件有这些:

事件名 描述
Attempting 尝试验证事件
Authenticated 验证通过事件
Failed 验证失败事件
Lockout 失败次数超过限制,锁住该请求再次访问事件
Logi 通过‘remember_token"成功登录时,调用的事件
Logout 用户退出事件
Registered 用户注册事件

还有一些其他的认证方法:

  • 检查是否存在认证用户:Auth::check()
  • 获取当前认证用户:Auth::user()
  • 退出系统:Auth::logout()

密码处理

配置解读

return [ "defaults" => [  "passwords" => "users",  ... ],  "passwords" => [  "users" => [   "provider" => "users",   "table" => "password_resets",   "expire" => 60,  ], ],]

从下往上,看配置;

  • passwords数组是重置密码的配置;users是配置方案的别名,包含三个元素:provider(提供用户的方案,是上面providers数组)、table(存放重置密码token的表)、expire(token过期时间)
  • default 项会设置默认的 passwords 重置方案;

重置密码的调用与实现

先看看Laravel的重置密码功能是怎么实现的:

public function reset(array $credentials, Closure $callback) { // 验证用户名、密码和 token 是否有效 $user = $this->validateReset($credentials); if (! $user instanceof CanResetPasswordContract) {   return $user; }   $password = $credentials["password"]; // 回调函数执行修改密码,及持久化存储 $callback($user, $password); // 删除重置密码时持久化存储保存的 token $this->tokens->delete($user); return static::PASSWORD_RESET;} 

再看看FoundationAuth模块封装的重置密码模块是怎么调用的:

// 暴露的重置密码 APIpublic function reset(Request $request) { // 验证请求参数 token、email、password、password_confirmation $this->validate($request, $this->rules(), $this->validationErrorMessages()); // 调用重置密码的方法,第二个参数是回调,做一些持久化存储工作 $response = $this->broker()->reset(  $this->credentials($request), function ($user, $password) {  $this->resetPassword($user, $password);  } ); // 封装 Response return $response == Password::PASSWORD_RESET  ? $this->sendResetResponse($response)  : $this->sendResetFailedResponse($request, $response);}// 获取重置密码时的请求参数protected function credentials(Request $request) { return $request->only(  "email", "password", "password_confirmation", "token" );}// 重置密码的真实性验证后,进行的持久化工作protected function resetPassword($user, $password) { // 修改后的密码、重新生成 remember_token $user->forceFill([  "password" => bcrypt($password),  "remember_token" => Str::random(60), ])->save(); // session 中的用户信息也进行重新赋值           $this->guard()->login($user);} 

“忘记密码 => 发邮件 => 重置密码” 的大体流程如下:

  • 点击“忘记密码”,通过路由配置,跳到“忘记密码”页面,页面上有“要发送的邮箱”这个字段要填写;
  • 验证“要发送的邮箱”是否是数据库中存在的,如果存在,即向该邮箱发送重置密码邮件;
  • 重置密码邮件中有一个链接(点击后会携带 token 到修改密码页面),同时数据库会保存这个 token 的哈希加密后的值;
  • 填写“邮箱”,“密码”,“确认密码”三个字段后,携带 token 访问重置密码API,首页判断邮箱、密码、确认密码这三个字段,然后验证 token是否有效;如果是,则重置成功;

权限管理

权限管理是依靠内存空间维护的一个数组变量abilities来维护,结构如下:

$abilities = array( "定义的动作名,比如以路由的 as 名(common.dashboard.list)" => function($user) {  // 方法的参数,第一位是 $user, 当前 user, 后面的参数可以自行决定  return true; // 返回 true 意味有权限, false 意味没有权限 }, ......);

但只用 $abilities,会使用定义的那部分代码集中在一起太烦索,所以有policy策略类的出现;

policy策略类定义一组实体及实体权限类的对应关系,比如以文章举例:

有一个 Modal实体类叫 Post,可以为这个实体类定义一个PostPolicy权限类,在这个权限类定义一些动作为方法名;

class PostPolicy { // update 权限,文章作者才可以修改 public function update(User $user, Post $post) {  return $user->id === $post->user_id; }}

然后在ServiceProvider中注册,这样系统就知道,如果你要检查的类是Post对象,加上你给的动作名,系统会找到PostPolicy类的对应方法;

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

怎么调用呢?

对于定义在abilities数组的权限:

  • 当前用户是否具备common.dashboard.list权限:Gate::allows("common.dashboard.list")
  • 当前用户是否具备common.dashboard.list权限:! Gate::denies("common.dashboard.list")
  • 当前用户是否具备common.dashboard.list权限:$request->user()->can("common.dashboard.list")
  • 当前用户是否具备common.dashboard.list权限:! $request->user()->cannot("common.dashboard.list")
  • 指定用户是否具备common.dashboard.list权限:Gate::forUser($user)->allows("common.dashboard.list")

对于policy策略类调用的权限:

  • 当前用户是否可以修改文章(Gate 调用):Gate::allows("update", $post)
  • 当前用户是否可以修改文章(user 调用):$user->can("update", $post)
  • 当前用户是否可以修改文章(用帮助函数):policy($post)->update($user, $post)
  • 当前用户是否可以修改文章(Controller 类方法中调用):$this->authorize("update", $post);
  • 当前用户是否可以修改文章(Controller 类同名方法中调用):$this->authorize($post);
  • 指定用户是否可以修改文章(Controller 类方法中调用):$this->authorizeForUser($user, "update", $post);

有用的技巧

获取当前系统注册的权限,包括两部分abilities和policies数组内容,代码如下:

$gate = app(IlluminateContractsAuthAccessGate::class);$reflection_gate = new ReflectionClass($gate);$policies = $reflection_gate->getProperty("policies");$policies->setAccessible(true);// 获取当前注册的 policies 数组dump($policies->getValue($gate));                          $abilities = $reflection_gate->getProperty("abilities");          $abilities->setAccessible(true);// 获取当前注册的 abilities 数组dump($abilities->getValue($gate));

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对网页设计的支持。

一佰互联是全国知名建站品牌服务商,我们有九年网站建设、网站制作、网页设计、php开发和域名注册及虚拟主机服务经验,提供的自助建站服务更是全国有名。近年来还整合团队优势自主开发了可视化多用户”巅云建站系统“3.0平台版,拖拽排版网站制作设计,轻松实现pc站、手机微网站、小程序、APP一体化全网营销网站建设 ,已成功的为全国上百家网络公司提供自助建站平台搭建服务。

相关新闻more

27
03月
怎样做好网站标题优化和描述优化?网站URL如

简介:怎样做好网站标题优化和描述优化?网站URL如何优化?在网站的SEO优化中,网站的标题及描述也是非常重要的,搜索引擎是依据网站标题和描述... >>详情

26
03月
网店代运营-帮您深度解析淘宝搜索权重规则!

简介:2019的直通车,想通过技术操作将投入产出比做到盈亏平衡点以上,已经越来越难了。那么直通车的未来何去何从,什么样的情况下直通车能够接受... >>详情

14
04月
美国大学开发心灵机器人 可预测你的意图

10月10日报道:据国外媒体报道,对于那些担心机器人将变得比人类更聪明并可自我建造的人来说,美国伊利诺伊大学芝加哥分校的最新研究将令他们感到... >>详情

01
04月
英国制定智能汽车网络安全准则 防止黑客攻击

简介:据外媒报道,日前,英国多家汽车制造商联合科研机构与交通部,共同制定了一套自动驾驶和联网汽车的网络安全指南,以确保未来智能汽车不会被黑客... >>详情

营业执照. cdn加速服务 备案系统认证 网络安全协会 我们的支付方式AAA认证
上海 北京 深圳 广州 天津 杭州 南京 武汉 成都 沈阳 大连 长沙 济南 青岛 苏州 福州 无锡 哈尔滨 宁波 重庆 大庆 厦门 西安 长春 珠海 郑州 海口 昆明 太原 石家庄 温州 合肥 乌鲁木齐 南宁 南通 合肥 兰州 呼和浩特 贵阳 烟台 秦皇岛 包头 唐山 银川 汕头 连云港 威海 西宁 湛江 北海 万州 涪陵 长寿 黔江 永川 丰都 忠县 江津 南川 开县 云阳 万盛 梁平 垫江 巫山 城口 建站宝盒 免费建站 门户网站建设 微信网站 手机网站 门户网站制作

7x24小时服务电话:18581389571 传真:023-85725751 免费建站交流群:236412099 139947842(自助建站交流) E-Mail:post@yinxi.net 网站投诉:
重庆楚捷科技有限公司 一佰互联©版权所有 自助建站(www.yinxi.net,Inc.) 2001-2020 All Rights Reserved 本站程序受法律保护,网站法律顾问:ITLAW-庄毅雄律师
中华人民共和国信息产业部网站备案号:渝ICP备12000592号