Laravel 多用户认证
- laravel 多用戶認(rèn)證 架構(gòu)
背景
項(xiàng)目包含若干子站點(diǎn),不同站點(diǎn)功能各異,但共享底層數(shù)據(jù)及邏輯。公用同一個(gè)Auth 中間件來(lái)進(jìn)行多用戶登錄。用意是最大限度利用 Laravel 自帶的認(rèn)證系統(tǒng)。不過(guò)默認(rèn)的認(rèn)證都是根據(jù) 『email』和『password』字段進(jìn)行的。之后有時(shí)間可能再追加自定義字段比如『phone』的改造方案。
具體方案
項(xiàng)目按照不同站點(diǎn)組織成不同模塊,在 Laravel 原有目錄結(jié)構(gòu)基礎(chǔ)內(nèi),分別給各個(gè)站點(diǎn)創(chuàng)設(shè)目錄。
laravel 5.5 project ├── app │ └── Http │ └── Controllers │ ├── Admin 后臺(tái)目錄 │ │ ├── IndexController │ │ └── LoginController │ ├── Home 前臺(tái)目錄 │ │ └── IndexController │ └── Auth laravel自帶的認(rèn)證目錄 └── resources└── views├── admin├── auth└── home復(fù)制代碼本文以 Admin 為例進(jìn)行說(shuō)明,如需增加其他站點(diǎn),進(jìn)行類似改動(dòng)即可。
上面的目錄是我們最終的目錄 其中 Auth 目錄 是通過(guò) 命令生成:
php artisan make:auth 復(fù)制代碼運(yùn)行命令以后就會(huì)生成一套權(quán)限系統(tǒng), 然后 打開路由(web.php) 文件 會(huì)看到:
Auth::routes(); Route::get('/home','HomeController@index')->middleware('auth');復(fù)制代碼訪問(wèn) 項(xiàng)目 /home 則會(huì)跳轉(zhuǎn)到 登錄
接下來(lái) 我們 把這個(gè)路由改造一下, 首先改造路由:
Auth::routes(); Route::get('/','Home\IndexController@index')->middleware('auth');復(fù)制代碼系統(tǒng)默認(rèn)的是使用 emial 登錄的 ,如果需要使用用戶名登錄 則 需要打開 :
上面所提到的Controller 下 Auth 目錄中的 LoginController.php 在里面重寫:
public function username(){return 'name';} 復(fù)制代碼重寫跳轉(zhuǎn)
protected $redirectTo = '/';復(fù)制代碼控制器寫完 接下來(lái) 修改一下 login 的頁(yè)面 英文的換 中文 就不說(shuō)了
ok 上面修改完畢以后 我們把系統(tǒng)自帶的 認(rèn)證當(dāng)做 我們的前臺(tái)用戶的認(rèn)證 接下來(lái)我們開始改造后臺(tái)認(rèn)證
開始 自定義 guard
- 打開config中的 auth.php,代碼如下:
上面 App\Model\Admin::class 中的 Admin 是我 后臺(tái)用戶表 叫做 amdin
- 開始建model類
運(yùn)行完畢,就會(huì)看到:
laravel 5.5 project├── app└──Model└──Admin.php復(fù)制代碼其中 Admin.php 的代碼內(nèi)容是:
namespace App\Model;use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatable;class Admin extends Authenticatable{use Notifiable;protected $fillable = ['name', 'password', //你要驗(yàn)證的字段];/*** 數(shù)組隱藏的屬性** @var array*/protected $hidden = ['password', 'remember_token',];} 復(fù)制代碼寫完Model以后 重點(diǎn)開始 :
寫路由
/** 前端路由開始 ***/ Auth::routes(); Route::get('/','Home\IndexController@index')->middleware('auth');/** 前端路由 結(jié)束 **//** 后臺(tái)登錄 **/ Route::get('admin/login','Admin\LoginController@showLoginForm'); Route::get('admin/logout','Admin\LoginController@logout')->name('admin-logout'); Route::post('admin/login','Admin\LoginController@login')->name("admin-login");/** 后臺(tái)路由 **/ Route::group(['prefix'=>'admin','middleware'=>'auth:admin'],function () {Route::get('/','Admin\IndexController@index'); });復(fù)制代碼寫后端登錄驗(yàn)證:
上面路由中 我們看到 有 LoginController 控制器 所以 命令行走起:
php artisan make:controller Admin/LoginController 復(fù)制代碼運(yùn)行完畢以后 打開: app/Http/controller/Admin/LoginController.php 開始寫驗(yàn)證:代碼是
namespace App\Http\Controllers\Admin;use Illuminate\Http\Request; use App\Http\Controllers\Controller;class LoginController extends Controller {// 展示后臺(tái)登錄的頁(yè)面public function showLoginForm(){return view('admin.login');}//處理登錄操作public function login(Request $request){//auth('admin') 你自定義的grude attempt(['要驗(yàn)證的字段'=>'發(fā)送過(guò)來(lái)的值'])$res = auth('admin')->attempt(['name' => $request->get('name'), 'password' => $request->get('password')]);//返回 bool值if ($res) {return redirect('admin');} else {return redirect('admin/login');}}//退出public function logout(){auth('admin')->logout();return redirect('admin/login');} }復(fù)制代碼如上代碼所示 登錄成功以后 就可以通過(guò)redirect 跳轉(zhuǎn)
寫http請(qǐng)求處理:
找到Exceptions 目錄下的 Handler.php 文件 重寫 下面方法:
protected function unauthenticated($request, AuthenticationException $exception){if ($request->expectsJson()) {return response()->json(['error' => 'Unauthenticated.'], 401);}if(empty($exception->guards())){return redirect()->guest('login');}//中間件各模塊之間跳轉(zhuǎn)問(wèn)題return redirect()->guest($exception->guards()[0].'/login');} 復(fù)制代碼Ok 至此后臺(tái)登錄也寫完畢了
在后臺(tái)首頁(yè)中如何如何獲取登錄的用戶的信息
$users = auth()->user();dd($users);就會(huì)看到用戶的信息 復(fù)制代碼轉(zhuǎn)載于:https://juejin.im/post/5a6adf576fb9a01ca47ab784
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Laravel 多用户认证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新买的睡衣要洗吗
- 下一篇: ShaderLab学习小结(一)最简化的