Laravel不修改源碼的前提Auth驗(yàn)證替換成md5

在讀這篇文章之前,請(qǐng)先弄明白容器的運(yùn)作原理额各。
注意国觉,版本是5.1 LTS那個(gè)。其他版本的原理都差不多虾啦。

我們?cè)趽Q成laravel的時(shí)候麻诀,可能會(huì)遇到一個(gè)問題,就是以前可能用md5或者其他驗(yàn)證方式的傲醉,然后在laravel里面蝇闭,密碼的認(rèn)證方式又換了,不想自己重寫認(rèn)證方式硬毕,又想沿用以前的md5需求呻引。

其實(shí)我們?cè)诳磍aravel的Auth::attempt()的時(shí)候,可以發(fā)現(xiàn)吐咳,laravel逻悠,調(diào)用的驗(yàn)證方法是基于一個(gè)hash類。

    /**
     * Validate a user against the given credentials.
     *
     * @param \Illuminate\Contracts\Auth\Authenticatable $user
     * @param array                                      $credentials
     *
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['password'];

        return $this->hasher->check($plain, $user->getAuthPassword());
    }

我們只要替換了這個(gè)hash類挪丢,就完全可以做到使用我們想要的驗(yàn)證方式去驗(yàn)證登錄了蹂风。
那么怎么替換呢卢厂?我們其實(shí)可以發(fā)現(xiàn)乾蓬,在config/auth.php里面,我們?cè)O(shè)置了auth的驅(qū)動(dòng)慎恒,這個(gè)驅(qū)動(dòng)一般默認(rèn)是eloquent任内,在vendor/laravel/framework/src/Illuminate/Auth/AuthServiceProvider.php里面。

    /**
     * Register the authenticator services.
     *
     * @return void
     */
    protected function registerAuthenticator()
    {
        $this->app->singleton('auth', function ($app) {
            // Once the authentication service has actually been requested by the developer
            // we will set a variable in the application indicating such. This helps us
            // know that we need to set any queued cookies in the after event later.
            $app['auth.loaded'] = true;

            return new AuthManager($app);
        });

        $this->app->singleton('auth.driver', function ($app) {
            return $app['auth']->driver();
        });
    }

這里面根據(jù)配置綁定了hash的驅(qū)動(dòng)融柬,那么我們接下來就看一下綁定了什么驅(qū)動(dòng)死嗦,到目錄vendor/laravel/framework/src/Illuminate/Auth下,我們可以看到有EloquentUserProvider.php粒氧。

<?php
namespace Illuminate\Auth;

use Illuminate\Support\Str;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;

class EloquentUserProvider implements UserProvider
{
    /**
     * The hasher implementation.
     *
     * @var \Illuminate\Contracts\Hashing\Hasher
     */
    protected $hasher;

    /**
     * The Eloquent user model.
     *
     * @var string
     */
    protected $model;

    /**
     * Create a new database user provider.
     *
     * @param  \Illuminate\Contracts\Hashing\Hasher  $hasher
     * @param  string  $model
     * @return void
     */
    public function __construct(HasherContract $hasher, $model)
    {
        $this->model = $model;
        $this->hasher = $hasher;
    }
    ....
      /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserContract $user, array $credentials)
    {
        $plain = $credentials['password'];

        return $this->hasher->check($plain, $user->getAuthPassword());
    }
    .....

通過這個(gè)越除,我們可以看出,這里面在構(gòu)造方法注入了hash的驅(qū)動(dòng),然后在驗(yàn)證的時(shí)候調(diào)用了hash的檢查函數(shù)去驗(yàn)證用戶的密碼是否正確摘盆,也就是說翼雀,我們只要替換了這個(gè)hash驅(qū)動(dòng)就可以解決問題了。

那么我們開始做孩擂,首先狼渊,我們需要去實(shí)現(xiàn)laravel的hash接口。弄一個(gè)md5的類出來类垦。

<?php

namespace Tools\MD5;

use Illuminate\Contracts\Hashing\Hasher;

class MD5 implements Hasher
{
    /**
     * Hash the given value.
     *
     * @param string $value
     *
     * @return array  $options
     * @return string
     */
    public function make($value, array $options = [])
    {
        return md5($value);
    }

    /**
     * Check the given plain value against a hash.
     *
     * @param string $value
     * @param string $hashedValue
     * @param array  $options
     *
     * @return bool
     */
    public function check($value, $hashedValue, array $options = [])
    {
        return $this->make($value) === $hashedValue;
    }

    /**
     * Check if the given hash has been hashed using the given options.
     *
     * @param string $hashedValue
     * @param array  $options
     *
     * @return bool
     */
    public function needsRehash($hashedValue, array $options = [])
    {
        return false;
    }
}

這個(gè)類你可以自己手動(dòng)創(chuàng)建在自己對(duì)應(yīng)的文件夾狈邑。

然后我們創(chuàng)建一個(gè)provider,php artisan make:provider RiskUserProvider蚤认。
這個(gè)類就是關(guān)鍵了米苹。
我們?cè)谶@個(gè)類下,需要直接繼承Illuminate\Auth\EloquentUserProvider砰琢,這樣它的許多方法我們都不需要去重寫了驱入,我們只要重寫它的構(gòu)造函數(shù)。

<?php

namespace App\Providers;

use Auth;
use Illuminate\Auth\EloquentUserProvider;

class RiskUserProvider extends EloquentUserProvider
{
  public function __construct($hasher, $model)
  {
      parent::__construct($hasher, $model);
  }
}

最后氯析,我們要將這個(gè)新的provider亏较,注入auth。

        Auth::extend('riak', function($app){
            $model = $this->app['config']['auth.model'];

            return new RiskUserProvider(new MD5(), $model); //這里就是直接將我們新實(shí)現(xiàn)的md5類傳遞過去
        });

我們可以在AuthServiceProvider的boot方式注入就好了掩缓。
根據(jù)b35f1cb8a1fd這個(gè)朋友的反饋雪情,5.2是使用Auth::provider方法,詳細(xì)我自己并沒有嘗試過你辣,不過這位朋友成功了巡通,謝謝這位朋友的反饋。

最后最后舍哄,我們?cè)赾onfig/auth.php里面宴凉,替換驅(qū)動(dòng)成riak。這樣問題就解決了表悬。

這篇文章寫的時(shí)候弥锄,沒有詳細(xì)解釋laravel的容器,如果你覺得看起來晦澀難懂蟆沫,是因?yàn)槟銢]有弄懂容器籽暇,詳細(xì)理解之后會(huì)看懂的,laravel的入門門檻確實(shí)比較高饭庞,對(duì)于新手來說可能非常不友好戒悠,但是當(dāng)你理解了之后,會(huì)有很大的收獲的舟山,克服它绸狐。

另外卤恳,其實(shí)這里的替換方式可以變成直接實(shí)現(xiàn)UserProvider的接口,替換整個(gè)Provider寒矿,這樣做會(huì)比較正規(guī)一點(diǎn)纬黎,基本做法和上面描述的都差不多。有錯(cuò)誤的地方歡迎指正劫窒。

附上一篇參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末本今,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子主巍,更是在濱河造成了極大的恐慌冠息,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孕索,死亡現(xiàn)場(chǎng)離奇詭異逛艰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搞旭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門散怖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肄渗,你說我怎么就攤上這事镇眷。” “怎么了翎嫡?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵欠动,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我惑申,道長(zhǎng)具伍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任圈驼,我火速辦了婚禮人芽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绩脆。我一直安慰自己萤厅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布衙伶。 她就那樣靜靜地躺著祈坠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矢劲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天慌随,我揣著相機(jī)與錄音芬沉,去河邊找鬼躺同。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丸逸,可吹牛的內(nèi)容都是我干的蹋艺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼黄刚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捎谨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憔维,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤涛救,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后业扒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體检吆,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年程储,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹭沛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡章鲤,死狀恐怖摊灭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情败徊,我是刑警寧澤斟或,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站集嵌,受9級(jí)特大地震影響萝挤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜根欧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一怜珍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凤粗,春花似錦酥泛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至异逐,卻和暖如春捶索,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灰瞻。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工腥例, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辅甥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓燎竖,卻偏偏與公主長(zhǎng)得像璃弄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子构回,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容