以laravel-admin為例詳解Laravel單用戶登錄

本篇文章給大家帶來了關于laravel的相關知識,其中主要介紹了關于單用戶登錄的相關問題,下面一起來看一下以laravel-admin為例單用戶登錄的相關內容,希望對大家有幫助。

以laravel-admin為例詳解Laravel單用戶登錄

【相關推薦:laravel視頻教程

單用戶登錄這個術語大家都聽說過, 為什么要單用戶登錄? 比如: 視頻網站, 如果一個帳號充值了 VIP, 然后在把自己的帳號共享給其他人, 那其他人也會有 VIP 特權, 那公司的利益就受到了損失, 那帳號如果分給 1000 人, 10000 人, 這損失就不小, 那么今天帶著大家做一下單用戶登錄.

這里以laravel-admin為例

登錄

EncoreAdminControllersAuthController.php修改,可以將方法分離不在源文件上修改。

增加代碼

use?IlluminateSupportFacadesSession; use?IlluminateSupportFacadesRedis;

修改postLogin()方法

if?($this->guard()->attempt($credentials,?$remember))?{ ????? ?????//?return?$this->sendLoginResponse($request);//此注釋修改為以下 ?????return?$this->sendLoginResponse($request,$credentials); }

修改 sendLoginResponse()方法

protected?function?sendLoginResponse(Request?$request,$credentials) ????{ ????????admin_toastr(trans('admin.login_successful')); ????????$request->session()->regenerate(); ????????//?return?redirect()->intended($this->redirectPath()); ????????//?制作?token ?????????return?$this->createtoken($credentials,$request); ???????? ????}

增加 createtoken()方法

protected?function?createtoken($credentials,$request){ ??????????? ???????????//相同局域網下多設備通用token? ???????????if(!Redis::get('STRING_SINGLETOKEN_MAJOR_'.?$credentials['username'])){ ???????????????$time?=?time(); ????????????????//?當前?time?存入?Redis ???????????????Redis::set('STRING_SINGLETOKEN_MAJOR_'.?$credentials['username'],?$time); ???????????} ??????????? ???????????//局域網不通用?但設備使用?注釋上邊多設備使用 ???????????//???$time?=?time(); ??????????? ???????????$time=Redis::get('STRING_SINGLETOKEN_MAJOR_'.?$credentials['username']); ???????????//?md5?加密 ???????????$singleToken?=?md5($request->getClientIp()?.?$credentials['username']?.?$time?.'onlykey'); ???????????Redis::set('SINGLETOKEN_MAJOR_'.?$credentials['username'],$singleToken); ??????????? ???????????//?用戶信息存入?Session ???????????Session::put('user_login',?$credentials['username']); ???????? ???????? ?????????return?redirect()->intended($this->redirectPath()); ????}

首先登錄成功之后, 得到目前時間戳, 通過IP, time, 查詢得出用戶的username以及唯一防盜字符串onlykey,onlykey可以為任意字符,進行 MD5 加密, 得到 TOKEN 。然后我們將剛剛得到的時間戳以及token, 存入 Redis, Redis Key 為字符串拼接上username, 方便后面中間件的 TOKEN 驗證, 然后我們把用戶信息存入 Session .

創建中間件

中間件通俗點說就是訪問方法時,會提前驗證中間件的內容,驗證通過可以訪問要訪問方法

命令創建中間件

//?項目根目錄運行 ????php?artisan?make:middleware?SsoMiddleware

上面個命令會在 app/Http/Middleware下面生成一個SsoMiddleware.php 文件, 將中間件添加到app/Http/ Kernel.php

protected $routeMiddleware = []中添加以下

'SsoMiddleware'?=>?AppHttpMiddlewareSsoMiddleware::class,

現在到中間件中寫程序 app/Http/Middleware/SsoMiddleware.php, 在文件中有 handle 方法, 我們在這個方法中寫邏輯.

public?function?handle($request,?Closure?$next) ????{ ????????$prefix=config('admin.route.prefix'); ????????$array=['/'.$prefix.'/auth/login','/'.$prefix.'/auth/logout','/'.$prefix.'/auth/clearsession']; ????????$username=?Session::get('user_login'); ????????$url=$request->getRequestUri(); ???????? ??????? ????????if(in_array($url,$array)){ ???????? ????????????return?$next($request); ????????????exit; ????????} ??????? ???????? ????????if?($username)?{ ????????????//?獲取?Cookie?中的?token ????????????$singletoken?=?Redis::get('SINGLETOKEN_MAJOR_'.$username); ????????????if?($singletoken)?{ ????????????????//?從?Redis?獲取?time ????????????????$redisTime?=?Redis::get('STRING_SINGLETOKEN_MAJOR_'.?$username); ????????????????//?重新獲取加密參數加密 ????????????????$ip?=?$request->getClientIp(); ????????????????$secret?=?md5($ip?.?$username?.?$redisTime.'onlykey'); ????????????????if?($singletoken?!=?$secret)?{?????????????? ????????????????????//?記錄此次異常登錄記錄 ????????????????????//?DB::table('data_login_exception')->insert(['guid'?=>?$userInfo->guid,?'ip'?=>?$ip,?'addtime'?=>?time()]); ????????????????????//?清除?session?數據 ???????????????????? ????????????????????//?abort('404','你可能來到了沒有知識的荒漠'); ????????????????????//?return?redirect('/'.$prefix.'/auth/logout'); ????????????????????//?$request->session()->invalidate(); ????????????????????$data?=?[ ????????????????????????'message'?=>?'您的帳號在另一個地點登錄..!', ????????????????????????'url'?=>?'/'.$prefix.'/auth/clearsession', ????????????????????????'jumpTime'?=>?5, ????????????????????????'status'?=>?'error' ????????????????????]; ????????????????????//顯示模板及數據 ????????????????????return?response()->?view('errors/Prompt',compact('data')); ????????????????} ????????????????return?$next($request); ????????????}?else?{ ????????????????return?redirect('/'.$prefix.'/auth/logout'); ????????????} ????????}?else?{ ???????????? ????????????return?redirect('/'.$prefix.'/auth/logout'); ????????} ????}

上面中間件之中做的事情是: 獲取用戶存在 Session 之中的數據作為第一重判斷, 如果通過判斷, 進入第二重判斷, 先獲取token 以及存入 Redis 的時間戳, 取出來安順序和IP,username,time,onlykey,MD5加密, 加密后和客戶端得到的token 對比.

其中errors/Prompt為提示樣樣式需要點此下載

清除clearsession()方法

public?function?clearsession(Request?$request){ ????????$prefix=config('admin.route.prefix'); ???????return??redirect('/'.$prefix.'/auth/logout'); }

路由組

我們邏輯寫完了, 最后一步就是將用戶登錄后的每一步操作都掌控在自己手里, 這里我們就需要路由組.

修改config/admin.php

'middleware'?=>?['web',?'admin','SsoMiddleware'],

以上用一個wifi可以多設備登錄,不同網絡下登錄后者會頂掉前者

以laravel-admin為例詳解Laravel單用戶登錄

大功告成!!!

【相關推薦:laravel視頻教程

以上就是以

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享