Laravel Auth深入探究

今天在写Laravel登录的时候,根据需求也不想用laravel自带的auth登录认证,便在搜索了一番,开始了auth的深入探究之旅。

刚开始根据官方文档,用户认证 里的手动认证用户描述,实现了我的简单登录逻辑代码,如下:

public function login(Request $request)
{
    if (Auth::attempt(['name' => $request->name, 'password' => $request->password])) {
        //认证通过
        $rt = array('status' => 200, 'msg' => '登陆成功', 'data' => array('isLogin' => true));
    } else {
        $rt = array('status' => 400, 'msg' => '登陆失败', 'data' => array('isLogin' => false));
    }

    return response()->json($rt);
}

然后顺着laravel Auth的逻辑,找到在 Illuminate\Auth\Guard.php 中的 attempt 方法,如下图:

auth-1.png

根据代码的实现,最关键的点应该是以下两句代码:

$this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

$this->hasValidCredentials($user, $credentials)

我们一句一句来,顺着 retrieveByCredentials 方法,这里要说明的是,因为在 config/auth.php 中我选择的是 eloquent 认证驱动,所以找到 Illuminate\AuthEloquentUserProvider 下的 retrieveByCredentials方法,如下图:

auth-2.png

retrieveByCredentials 方法实现了根据用户登录输入的信息(除密码外),查询到登录用户的信息并返回。

然后执行 $this->hasValidCredentials($user, $credentials), 最终定位到 Illuminate\AuthEloquentUserProvider 中的 validateCredentials方法,如下图:

auth-3.png

最终Laravel 通过 Hash facade 提供 Bcrypt 加密来验证用户密码是否一致。(注意:数据库密码字段名为 password,若不是需在模型方法中重新指定)

看到了这里,也有了一些疑问,如果我不用hash来加密密码呢,使用md5 + "盐" 的方式,那就只有改写这个验证逻辑了。("盐" 在数据库中字段名为 salt

在 Illuminate\Contracts\Auth\Authenticatable 中加入方法:

public function getAuthSalt();

在 Illuminate\Auth\Authenticatable 加入方法:

public function getAuthSalt()
{
   return $this->salt;
}

改写上文提到的 retrieveByCredentials 方法

public function validateCredentials(UserContract $user, array $credentials)
{
    $plain = $credentials['password'];
    $authPassword = $user->getAuthPassword();
    $authSalt = $user->getAuthSalt();
    return $authPassword === md5($plain.$authSalt);
}

到这里基本就结束了,需要注意的是,使用Auth认证默认是 App\User.php,我根据需求更改了 config/auth.php,改成了 App\Models\User.php 因为该文件我是执行命令 php artisan make:model Models/User 生成的,便有了一点小坑的地方,它没有 use Auth 认证的类,所以此时将 app/User.php 下的复制过来即可。


以下是我在学习时,找到的两篇关于laravel auth 的文章,对我理解auth有很大的帮助


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 简介 laravel 使实施认证的变得非常简单,事实上,它提供了非常全面的配置项以适应应用的业务。认证的配置文件存...
    Dearmadman阅读 6,100评论 2 13
  • 过去做事情急,什么东西拿起来就用,不喜欢进行系统性的学习,造成在使用过程中的错误和低效,现在感觉自己耐心多了,用之...
    马文Marvin阅读 1,959评论 0 10
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,597评论 0 121
  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 3,029评论 0 12
  • 文|浪浪于江湖 全目录|【我的青春在深圳】 上一章|我的青春在深圳(9) 早上7点,他们从学校出发,上了火车以后,...
    青如许阅读 554评论 2 5