laravel如何實現多用戶體系登錄

laraveli添加一個或多個用戶表,以admin為例。

部分文件內容可能需要根據實際情況修改

推薦:laravel教程

創建一個Admin模型

php?artisan?make:model?Admin?-m

編寫admins表字段

Schema::create('admins',?function?(Blueprint?$table)?{ ????$table->increments('id'); ????$table->string('name')->unique(); ????$table->string('password'); ????$table->rememberToken(); ????$table->timestamps(); });

編輯admin模型

<?php namespace App; use IlluminateNotificationsNotifiable; use IlluminateFoundationAuthUser as Authenticatable; /**  * @property int $id  * @property CarbonCarbon $created_at  * @property CarbonCarbon $updated_at  */ class Admin extends Authenticatable {     use Notifiable;     protected $fillable = [         &#39;name&#39;, &#39;password&#39;,&#39;remember_token&#39;     ];     protected $hidden = [         &#39;password&#39;,&#39;remember_token&#39;     ]; }

修改auth.php配置文件

'guards'?=&gt;?[ ????... ????'admin'?=&gt;?[ ????????'driver'?=&gt;?'session', ????????'provider'?=&gt;?'admins' ????] ], 'providers'?=&gt;?[ ????... ????'admins'?=&gt;?[ ????????'driver'?=&gt;?'eloquent', ????????'model'?=&gt;?AppAdmin::class, ????] ],

在app/http/Controllers下創建目錄Admin/Auth

在Admin目錄下創建文件HomeController.php(這個文件用來測試登錄成功后的跳轉頁面)

<?php namespace AppHttpControllersAdmin; use AppHttpControllersController; use IlluminateHttpRequest; class HomeController extends Controller {     /**      * HomeController constructor.      */     public function __construct()     {         $this->middleware('auth:admin'); ????} ????/** ?????*?Show?the?application?dashboard. ?????* ?????*?@return?IlluminateHttpResponse ?????*/ ????public?function?index() ????{ ????????return?view('admin.home'); ????} }

使用命令生成一個Request

php?artisan?make:request?AdminLoginRequest

此時在app/Http/Request目錄下便生成了這個文件,然后編輯這個文件

<?php namespace AppHttpRequests; use IlluminateFoundationHttpFormRequest; class AdminLoginRequest extends FormRequest {     /**      * 確定用戶是否有權發出此請求.      *      * @return bool      */     public function authorize()     {         return true;     }     /**      * 獲取適用于請求的驗證規則.      *      * @return array      */     public function rules()     {         return [             &#39;name&#39;     =>?'required', ????????????'password'?=&gt;?['required',?'min:6']?//密碼必須,最小長度為6 ????????]; ????} }

在Admin/Auth目錄下創建文件LoginController.php

<?php namespace AppHttpControllersAdminAuth; use AppHttpControllersController; use AppHttpRequestsAdminLoginRequest; use IlluminateSupportFacadesAuth; class LoginController extends Controller {     public function showLoginForm()     {         return view(&#39;admin.auth.login&#39;);     }     public function postLogin(AdminLoginRequest $loginRequest)     {         $data = $loginRequest->only('name',?'password'); ????????$result?=?Auth::guard('admin')-&gt;attempt($data,?true); ????????if?($result)?{ ????????????return?redirect(route('admin.home')); ????????}?else?{ ????????????return?redirect()-&gt;back() ????????????????-&gt;with('name',?$loginRequest-&gt;get('name')) ????????????????-&gt;withErrors(['name'?=&gt;?'用戶名或密碼錯誤']); ????????} ????} ????public?function?postLogout() ????{ ????????Auth::guard('admin')-&gt;logout(); ????????return?redirect(route('admin.login.show')); ????} }

添加路由。打開app/providers/RouteServiceProvider.php

在方法mapWebRoutes()方法后面增加一個方法

protected?function?mapAdminWebRoutes() ????{ ????????Route::middleware('web') ????????????-&gt;prefix('admin') ????????????-&gt;namespace($this-&gt;namespace) ????????????-&gt;group(base_path('routes/admin.php')); ????}

在map()方法里調用上面增加的方法

public?function?map() ????{ ????????$this-&gt;mapApiRoutes(); ????????$this-&gt;mapAdminWebRoutes();//調用新增的方法 ????????$this-&gt;mapWebRoutes(); ????}

在routes目錄下增加一個路由文件admin.php

<?php Route::get(&#39;login&#39;,&#39;AdminAuthLoginController@showLoginForm&#39;)     ->middleware('guest:admin') ????-&gt;name('admin.login.show'); Route::get('/','AdminHomeController@index') ????-&gt;name('admin.home'); Route::post('login','AdminAuthLoginController@postLogin') ????-&gt;middleware('guest:admin') ????-&gt;name('admin.login.post'); Route::post('logout','AdminAuthLoginController@postLogout') ????-&gt;middleware('auth:admin') ????-&gt;name('admin.logout');

把home.blade.php復制到resources/views/admin下

把layouts/app.blade.php復制為layouts/admin.blade.php,修改相應的地方


把login.blade.php復制到admin/Auth目錄下

@extends('layouts.admin') @section('content') ????<div> ????????<div> ????????????<div> ????????????????<div> ????????????????????<div>Admin?Login</div> ????????????????????<div> ????????????????????????<form> ????????????????????????????{{?csrf_field()?}} ????????????????????????????<div>has('name')???'?has-error'?:?''?}}"&gt; ????????????????????????????????<label>E-Mail?Address</label> ????????????????????????????????<div> ????????????????????????????????????<input> ????????????????????????????????????@if?($errors-&gt;has('name')) ????????????????????????????????????????<span> ????????????????????????????????????????<strong>{{?$errors-&gt;first('name')?}}</strong> ????????????????????????????????????</span> ????????????????????????????????????@endif ????????????????????????????????</div> ????????????????????????????</div> ????????????????????????????<div>has('password')???'?has-error'?:?''?}}"&gt; ????????????????????????????????<label>Password</label> ????????????????????????????????<div> ????????????????????????????????????<input> ????????????????????????????????????@if?($errors-&gt;has('password')) ????????????????????????????????????????<span> ????????????????????????????????????????<strong>{{?$errors-&gt;first('password')?}}</strong> ????????????????????????????????????</span> ????????????????????????????????????@endif ????????????????????????????????</div> ????????????????????????????</div> ????????????????????????????<div> ????????????????????????????????<div> ????????????????????????????????????<button> ????????????????????????????????????????Login ????????????????????????????????????</button> ????????????????????????????????</div> ????????????????????????????</div> ????????????????????????</form> ????????????????????</div> ????????????????</div> ????????????</div> ????????</div> ????</div> @endsection

數據填充

php?artisan?make:seed?AdminsTableSeeder

編輯AdminsTableSeeder.php

public?function?run() ????{ ????????AppAdmin::insert([ ????????????'name'=&gt;'yzha5', ????????????'password'=&gt;?bcrypt('123456') ????????]); ????} DatabaseSeeder.php $this-&gt;call(AdminsTableSeeder::class);

文件上傳至服務器,登入服務器,執行填充命令

php?artisan?migrate php?artisan?db:seed

此時,直接打開http://xxx/admin并不會跳轉到http://xxx/admin/login,因此需要處理一些異常。打開app/Exceptions/Handle.php

重寫unauthenticated()方法。

use?IlluminateSupportFacadesRoute; protected?function?unauthenticated($request,?AuthenticationException?$exception) ????{ ????????return?starts_with(Route::currentRouteName(),?'admin') ??????????????redirect(route('admin.login.show')) ????????????:?parent::unauthenticated($request,?$exception); ????}

完善一下

以上代碼,當admin登錄后,再次訪問/admin/login這個URI時,會自動跳轉到/home這個URI,這是因為guest這個中間件默認跳轉到了/home,也就是middleware目錄下的RedirectIfAuthenticated.php這個文件。

解決方法為:

創建一個中單件,名為:RedirectIfAdminAuthenticated

php?artisan?make:middleware?RedirectIfAdminAuthenticated

編輯這個文件:

<?php namespace AppHttpMiddleware; use Closure; use IlluminateSupportFacadesAuth; class RedirectIfAdminAuthenticated {     /**      * Handle an incoming request.      *      * @param $request      * @param Closure $next      * @param null $guard      * @return IlluminateHttpRedirectResponse|IlluminateRoutingRedirector|mixed      */     public function handle($request, Closure $next, $guard = null)     {         if (Auth::guard($guard)->check())?{ ????????????return?redirect('/admin'); ????????} ????????return?$next($request); ????} } 在Kernel.php中添加一行 protected?$routeMiddleware?=?[ ????????... ????????'admin.guest'?=&gt;?AppHttpMiddlewareRedirectIfAdminAuthenticated::class, ????????... ????]; 更改admin路由,將guest:admin改為admin.guest:admin Route::get('login','AdminAuthLoginController@showLoginForm') ????-&gt;middleware('admin.guest:admin') ????-&gt;name('admin.login.show'); Route::post('login','AdminAuthLoginController@postLogin') ????-&gt;middleware('admin.guest:admin') ????-&gt;name('admin.login.post');

以上就是

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