位置: 编程技术 - 正文

通过修改Laravel Auth使用salt和password进行认证用户详解(laravel url重写)

编辑:rootadmin

推荐整理分享通过修改Laravel Auth使用salt和password进行认证用户详解(laravel url重写),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:通过修改幻灯片的什么可以改变超链接文字的颜色,通过修改幻灯片的什么可以改变超链接文字的颜色,通过修改母版中文字,通过修改幻灯片的 可以改变整个模板超链接文本的颜色,通过修改下列哪个参数可以,通过修改幻灯片的什么可以改变超链接文字的颜色,通过修改源代码修改网页内容,通过修改注册表修改edge主页,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

本文主要给大家介绍了通过修改Laravel Auth用salt和password进行认证用户的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

Laraval自带的用户认证系统Auth非常强大易用,不过在Laravel的用户认证系统中用户注册、登录、找回密码这些模块中用到密码加密和认证算法时使用的都是bcrypt,而很多之前做的项目用户表里都是采用存储salt + password加密字符串的方式来记录用户的密码的,这就给使用Laravel框架来重构之前的项目带来了很大的阻力,不过最近自己通过在网上找资料、看社区论坛、看源码等方式完成了对Laravel Auth的修改,在这里分享出来希望能对其他人有所帮助。 开篇之前需要再说明下如果是新项目应用Laravel框架,那么不需要对Auth进行任何修改,默认的bcrypt加密算法是比salt + password更安全更高效的加密算法。

修改用户注册

首先,在laravel 里启用验证是用的artisan命令

执行完命令后在routes文件(位置:app/Http/routes.php)会多一条静态方法调用

这个Route是Laravel的一个Facade (位于IlluminateSupportFacadesRoute), 调用的auth方法定义在IlluminateRoutingRouter类里, 如下可以看到auth方法里就是定义了一些Auth相关的路由规则

通过路由规则可以看到注册时请求的控制器方法是AuthController的register方法, 该方法定义在IlluminateFoundationAuthRegistersUsers这个traits里,AuthController在类定义里引入了这个traits.

在register方法里首先会对request里的用户输入数据进行验证,你只需要在AuthController的validator方法里定义自己的每个输入字段的验证规则就可以

接着往下看验证通过后,Laravel会掉用AuthController的create方法来生成新用户,然后拿着新用户的数据去登录Auth::guard($this->getGuard())->login($this->create($request->all()));

所以我们要自定义用户注册时生成用户密码的加密方式只需要修改AuthController的create方法即可。

比如:

修改用户登录

修改登录前我们需要先通过路由规则看一下登录请求的具体控制器和方法,在上文提到的auth方法定义里可以看到

验证登录的操作是在AppHttpControllersAuthAuthController类的login方法里。打开AuthController发现Auth相关的方法都是通过性状(traits)引入到类内的,在类内use 要引入的traits,在编译时PHP就会把traits里的代码copy到类中,这是PHP5.5引入的特性具体适用场景和用途这里不细讲。 所以AuthController@login方法实际是定义在IlluminateFoundationAuthAuthenticatesUsers这个traits里的

登录验证的主要操作是在Auth::guard($this->getGuard())->attempt($credentials, $request->has('remember'));这个方法调用中来进行的,Auth::guard($this->getGuard()) 获取到的是IlluminateAuthSessionGuard (具体如何获取的看Auth这个Facade IlluminateAuthAuthManager里的源码)

看一下SessionGuard里attempt 方法是如何实现的:

retrieveByCredentials是用传递进来的字段从数据库中取出用户数据的,validateCredentials是用来验证密码是否正确的实际过程。

这里需要注意的是$this->provider这个provider是一个实现了IlluminateContractsAuthUserProvider类的provider, 我们看到目录IlluminateAuth下面有两个UserProvider的实现,分别为DatabaseUserProvider和EloquentUserProvider, 但是我们验证密码的时候是通过那个来验证的呢,看一下auth的配置文件

这里配置的是driver => eloquent , 那么就是通过EloquentUserProvider的retrieveByCredentials来验证的, 这个EloquentUserProvider 是在SessionGuard实例化时被注入进来的, (具体是怎么通过读取auth配置文件, 实例化相应的provider注入到SessionGuard里的请查阅IlluminateAuthAuthManager 里createSessionDriver方法的源代码)

通过修改Laravel Auth使用salt和password进行认证用户详解(laravel url重写)

接下来我们继续查看EloquentUserProvider中retrieveByCredentials和validateCredentials方法的实现:

上面两个方法retrieveByCredentials用除了密码以外的字段从数据库用户表里取出用户记录,比如用email查询出用户记录,然后validateCredentials方法就是通过$this->haser->check来将输入的密码和哈希的密码进行比较来验证密码是否正确。

好了, 看到这里就很明显了, 我们需要改成自己的密码验证就是自己实现一下validateCredentials就可以了, 修改$this->hasher->check为我们自己的密码验证规则就可以了。

首先我们修改$user->getAuthPassword()把数据库中用户表的salt和password传递到validateCredentials中修改AppUser.php 添加如下代码

然后我们在建立一个自己的UserProvider接口的实现,放到自定义的目录中:

新建app/Foundation/Auth/AdminEloquentUserProvider.php

最后我们修改auth配置文件让Laravel在做Auth验证时使用我们刚定义的Provider,修改config/auth.php:

修改app/Provider/AuthServiceProvider.php

Auth::provider方法是用来注册Provider构造器的,这个构造器是一个Closure,provider方法的具体代码实现在AuthManager文件里

闭包返回了AdminEloquentUserProvider对象供Laravel Auth使用,好了做完这些修改后Laravel的Auth在做用户登录验证的时候采用的就是自定义的salt + password的方式了。

修改重置密码

Laravel 的重置密码的工作流程是:

向需要重置密码的用户的邮箱发送一封带有重置密码链接的邮件,链接中会包含用户的email地址和token。 用户点击邮件中的链接在重置密码页面输入新的密码,Laravel通过验证email和token确认用户就是发起重置密码请求的用户后将新密码更新到用户在数据表的记录里。

第一步需要配置Laravel的email功能,此外还需要在数据库中创建一个新表password_resets来存储用户的email和对应的token

通过重置密码表单的提交地址可以看到,表单把新的密码用post提交给了/password/reset,我们先来看一下auth相关的路由,确定/password/reset对应的控制器方法。

可以看到对应的控制器方法是AppHttpControllersAuthPasswordController类的reset方法,这个方法实际是定义在IlluminateFoundationAuthResetsPasswords 这个traits里,PasswordController引入了这个traits

方法开头先通过validator对输入进行验证,接下来在程序里传递把新密码和一个闭包对象传递给Password::broker($broker)->reset();方法,这个方法定义在IlluminateAuthPasswordsPasswordBroker类里.

在PasswordBroker的reset方法里,程序会先对用户提交的数据做再一次的认证,然后把密码和用户实例传递给传递进来的闭包,在闭包调用里完成了将新密码更新到用户表的操作, 在闭包里程序调用了的PasswrodController类的resetPassword方法

PasswrodController类resetPassword方法的定义

在这个方法里Laravel 用的是bcrypt 加密了密码, 那么要改成我们需要的salt + password的方式,我们在PasswordController类里重写resetPassword方法覆盖掉traits里的该方法就可以了。

结语

到这里对Laravel Auth的自定义就完成了,注册、登录和重置密码都改成了sha1(salt + password)的密码加密方式, 所有自定义代码都是通过定义Laravel相关类的子类和重写方法来完成没有修改Laravel的源码,这样既保持了良好的可扩展性也保证了项目能够自由迁移。

注:使用的Laravel版本为5.2

总结

标签: laravel url重写

本文链接地址:https://www.jiuchutong.com/biancheng/289904.html 转载请保留说明!

上一篇:laravel通过创建自定义artisan make命令来新建类文件详解(laravel添加数据)

下一篇:PHP面向对象中new self()与 new static()的区别浅析(php是面向对象语言吗)

  • 公转私做账麻烦吗
  • 开小卖部怎么报税
  • 金税四期怎么查账
  • 增值税的纳税人是谁
  • 高速公路通行费发票怎么开
  • 个体户核定双定户是否可以年度汇算清缴
  • 增值税报表填写说明
  • 单位车辆交强险赔付流程
  • 城市规划部门收取的市政建设配套费是否作为契税的征税基数
  • 抵款车辆低价卖给职工账务处理:
  • 短期薪酬是会计科目么
  • 无形资产研发费用加计扣除是晢时差异吗
  • 银行付款退汇怎么做账
  • 投标保证金利息计入什么科目
  • 免税的苗木发票抵扣税费怎么算
  • 个人与个人之间转账有限额吗
  • 未办理三证合一营业执照会注销吗
  • 房地产的出租行为属于土地增值税征收范围吗
  • 小规模季度超了9万怎么报增值税
  • 烟草企业发生的广告和宣传费在当年营业收入15
  • 会计利润和税务利润不一致
  • 企业年检网上申报时间
  • 红利抵免的用法是什么
  • win10系统声音有杂音
  • linux GTK、KDE、Gnome、XWindows 图形界面区别介绍
  • qqexternal.exe是什么进程如何删除(CPU的使用率在90%)
  • ae应用程序无法启动
  • 君子兰的养殖方法
  • 公司承担责任的方式
  • 安徽4岁男孩户口已解决
  • 迪格庄园阿拉扎尼河谷红葡萄酒750ml
  • chattr
  • Sandilands省级森林中被白霜覆盖的番红花,加拿大曼尼托巴 (© Jaynes Gallery/Danita Delimont)
  • 持有至到期投资在资产负债表怎么填
  • 应收账款应付账款属于什么科目
  • 使用php连接多种数据库
  • 会计如何分录
  • 前端按钮跳转界面
  • redux入门教程
  • 自然人办税服务大厅
  • 会计月末账务处理程序
  • 厂房推倒重建和改扩建的税务处理
  • 销售使用过的车辆应该如何交增值税
  • 富文本word
  • 残保金滞纳金免征吗
  • 运费和什么有关
  • 企业不交所得税的情况
  • 增值税发票已抵扣怎么红冲
  • mysql insert语句操作实例讲解
  • 以前年度应收账款贷方余额如何调整
  • 市场开发费用会计分录
  • 实际费用以什么为准
  • 预付账款要设明细科目吗
  • 什么经营范围可以开推广服务费
  • 报关单不在海关信息中
  • 商标无形资产摊销计入什么科目
  • 财务单独核算是什么意思
  • 营业执照可以变更名字和经营范围吗
  • mysql5.5忘记密码
  • windows10怎么隐藏工具栏
  • windows7录音怎么录
  • win8待机后无法唤醒
  • Win10 Mobile 10586.29重要更新 可以玩wp7中的游戏
  • 如何写出一篇游戏活动案例
  • js canvas压缩图片
  • andengine学习,《android游戏开发实践指南》详解
  • cssimage
  • 英语中our和my的区别
  • 欢迎使用微信支付
  • jquery获取点击的对象
  • wpf窗口嵌套
  • js如何实现图片懒加载
  • 建筑工程资质挂靠合同
  • 税控盘的口令密码是什么
  • 网上怎么申报地税
  • 天津市税务总局现任领导
  • 税务登记证办理
  • 在江西税务网交医保流程
  • 地方税务局投诉有用吗
  • 课税对象与征税对象一样吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设