用戶認(rèn)證

前期準(zhǔn)備

Laravel的權(quán)限配置文件位于 config/auth.php屑柔,Laravel的認(rèn)證組件由“guards”和“providers”組成,
Guard 通過 session 來維護(hù)用戶登錄的狀態(tài)姻氨。Provider 是登錄以及訪問頁面的時(shí)候獲取用戶的信息。本篇主要講的是如何自定義Provider 剪验,獲取用戶信息肴焊。

config/auth.php文件

Laravel提供了兩種guard,web以及api功戚,采取默認(rèn)的web認(rèn)證娶眷。在guards的web中,用了users提供者啸臀。接下來就需要注意了届宠,我們自定義了服務(wù)提供者,就需要換到新的providers乘粒。首先豌注,定義一個(gè)使用新驅(qū)動(dòng)的provider:

 'providers' => [
     'users' => [
           'driver' => 'Focus',  //名稱自定義,這里為Focus
           'model' => App\Models\User::class,  //Model放在Models文件夾下
      ],
],

Notes: 默認(rèn)提供了兩種驅(qū)動(dòng)database和eloquent灯萍,而這兩種的提供者分別是DatabaseUserProvider和EloquentUserProvider轧铁,都處于laravel\framework\src\Illuminate\Auth文件夾下,實(shí)現(xiàn)了UserProvider旦棉,我們自定義的 Focus provider 也將實(shí)現(xiàn)UserProvider齿风。

生成路由和視圖

php artisan make:auth  //命令可快速生成認(rèn)證所需要的路由和視圖

Http/Controllers 和 resources/views下會(huì)相應(yīng)生成控制器和視圖
默認(rèn)用的Email药薯,我們用username

LoginController:
//添加此方法,返回username

public function username(){
    return 'username';
}

login.blade.php:
將郵箱改為域賬號(hào)救斑,email 改為username

數(shù)據(jù)庫

修改.env配置中的數(shù)據(jù)庫信息果善。

php artisan make:model Models/User  // 使用命令創(chuàng)建User模型

默認(rèn)User是繼承Model的,需要修改系谐。

use Illuminate\Foundation\Auth\User as Authenticatable;  //引入Authenticatable
class User extends Authenticatable
{
    protected $table      = 'employee';
        protected $primaryKey = 'employee_id';

         //can set all fields to user model
        protected $guarded = [];
}

為什么要引入Authenticatable呢,是因?yàn)锳uthenticatable實(shí)現(xiàn)了Illuminate\Contracts\Auth\Authenticatable接口讨跟,而FocusUserProvider 需要用到接口的實(shí)現(xiàn)纪他。

創(chuàng)建擴(kuò)展

在app下新建 Extensions/FocusUserProvider 文件,參考DatabaseUserProvider和EloquentUserProvider晾匠,實(shí)現(xiàn)UserProvider:

namespace App\Extensions;

use App\Services\LdapValidator;
use Illuminate\Support\Str;
use Illuminate\Contracts\Auth\UserProvider;
use \Illuminate\Contracts\Auth\Authenticatable;
    
class LaravelUserProvider implements UserProvider {

    protected $model;

    public function __construct($model)
    {
           $this->model = $model;
    } 
   
   //登錄成功后茶袒,通過此方法獲取用戶信息,返回匹配該ID的 Authenticatable 實(shí)現(xiàn)
    public function retrieveById($identifier) {
       
      //此處可以將信息放入緩存凉馆,緩解數(shù)據(jù)庫壓力薪寓。
        $model = $this->createModel();
        return $model->newQuery()
            ->where($model->getAuthIdentifierName(), $identifier)
            ->first();
    }

    public function retrieveByToken($identifier, $token) {
    }
    public function updateRememberToken(Authenticatable $user, $token) {
    }

    //該方法可以根據(jù)賬號(hào)名去查詢數(shù)據(jù)庫是否存在匹配的賬號(hào)
    public function retrieveByCredentials(array $credentials) {  

        if (empty($credentials)) {
            return;
        }

        // First we will add each credential element to the query as a where clause.
        // Then we can execute the query and, if we found a user, return it in a
        // Eloquent User "model" that will be utilized by the Guard instances.
        $query = $this->createModel()->newQuery();

         foreach ($credentials as $key => $value) {
            if (! Str::contains($key, 'password')) {
                $query->where($key, $value);
            }
        }

        return $query->first();     
    }
  
   //該方法可以驗(yàn)證密碼是否正確,因?yàn)槲覀兪莑dap登錄澜共,可以在此驗(yàn)證域賬號(hào)
    public function validateCredentials(Authenticatable $user, array $credentials) {
       
      //LdapValidator類是為了驗(yàn)證域密碼的向叉,放在了app/Services,在上面已經(jīng)引入
        $Ldap  = new LdapValidator($user->username, $credentials['password']);
        
        return $Ldap->validatePassword();
    }

    /**
     * Create a new instance of the model.
     *
     * @return \Illuminate\Database\Eloquent\Model
     */
    public function createModel()
    {
        $class = '\\'.ltrim($this->model, '\\');

        return new $class;
    }

}

注冊(cè)提供者

Laravel 提供了AuthServiceProvider嗦董, 我們可以在這里注冊(cè)母谎。

public function boot()
{
        $this->registerPolicies();
       
       //Focus為auth.php里面定義的驅(qū)動(dòng)
        Auth::provider('Focus', function($app, array $config){

             return new FocusUserProvider ($config['model']);
        });
} 

下面就可以訪問http://你的域名/login 登錄系統(tǒng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奇唤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匹摇,老刑警劉巖咬扇,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異廊勃,居然都是意外死亡懈贺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門坡垫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隅居,“玉大人,你說我怎么就攤上這事葛虐√ピ矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屿脐,是天一觀的道長(zhǎng)涕蚤。 經(jīng)常有香客問我宪卿,道長(zhǎng),這世上最難降的妖魔是什么万栅? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任佑钾,我火速辦了婚禮,結(jié)果婚禮上烦粒,老公的妹妹穿的比我還像新娘休溶。我一直安慰自己,他們只是感情好扰她,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布兽掰。 她就那樣靜靜地躺著,像睡著了一般徒役。 火紅的嫁衣襯著肌膚如雪孽尽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天忧勿,我揣著相機(jī)與錄音杉女,去河邊找鬼。 笑死鸳吸,一個(gè)胖子當(dāng)著我的面吹牛熏挎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晌砾,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婆瓜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了贡羔?” 一聲冷哼從身側(cè)響起廉白,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乖寒,沒想到半個(gè)月后猴蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楣嘁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年磅轻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逐虚。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聋溜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叭爱,到底是詐尸還是另有隱情撮躁,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布买雾,位于F島的核電站把曼,受9級(jí)特大地震影響杨帽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗤军,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一注盈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叙赚,春花似錦老客、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冤荆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間权纤,已是汗流浹背钓简。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹想,地道東北人外邓。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像古掏,于是被迫代替她去往敵國(guó)和親损话。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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