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 = [ 'name', 'password','remember_token' ]; protected $hidden = [ 'password','remember_token' ]; }
修改auth.php配置文件
'guards'?=>?[ ????... ????'admin'?=>?[ ????????'driver'?=>?'session', ????????'provider'?=>?'admins' ????] ], 'providers'?=>?[ ????... ????'admins'?=>?[ ????????'driver'?=>?'eloquent', ????????'model'?=>?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 [ 'name' =>?'required', ????????????'password'?=>?['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('admin.auth.login'); } public function postLogin(AdminLoginRequest $loginRequest) { $data = $loginRequest->only('name',?'password'); ????????$result?=?Auth::guard('admin')->attempt($data,?true); ????????if?($result)?{ ????????????return?redirect(route('admin.home')); ????????}?else?{ ????????????return?redirect()->back() ????????????????->with('name',?$loginRequest->get('name')) ????????????????->withErrors(['name'?=>?'用戶名或密碼錯誤']); ????????} ????} ????public?function?postLogout() ????{ ????????Auth::guard('admin')->logout(); ????????return?redirect(route('admin.login.show')); ????} }
添加路由。打開app/providers/RouteServiceProvider.php
在方法mapWebRoutes()方法后面增加一個方法
protected?function?mapAdminWebRoutes() ????{ ????????Route::middleware('web') ????????????->prefix('admin') ????????????->namespace($this->namespace) ????????????->group(base_path('routes/admin.php')); ????}
在map()方法里調用上面增加的方法
public?function?map() ????{ ????????$this->mapApiRoutes(); ????????$this->mapAdminWebRoutes();//調用新增的方法 ????????$this->mapWebRoutes(); ????}
在routes目錄下增加一個路由文件admin.php
<?php Route::get('login','AdminAuthLoginController@showLoginForm') ->middleware('guest:admin') ????->name('admin.login.show'); Route::get('/','AdminHomeController@index') ????->name('admin.home'); Route::post('login','AdminAuthLoginController@postLogin') ????->middleware('guest:admin') ????->name('admin.login.post'); Route::post('logout','AdminAuthLoginController@postLogout') ????->middleware('auth:admin') ????->name('admin.logout');
把home.blade.php復制到resources/views/admin下
把layouts/app.blade.php復制為layouts/admin.blade.php,修改相應的地方
- ???? ????@guest(‘admin’) ????????
- admin?Login
- ???????? ????????????{{?Auth::guard(‘admin’)->user()->name?}}? ???????? ????????
- ????????????
- ???????????????? ????????????????????Logout ???????????????? ????????????????
????????????
????????
????
- ???????????????? ????????????????????Logout ???????????????? ????????????????
????@else ????
????@endguest
把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'?:?''?}}"> ????????????????????????????????<label>E-Mail?Address</label> ????????????????????????????????<div> ????????????????????????????????????<input> ????????????????????????????????????@if?($errors->has('name')) ????????????????????????????????????????<span> ????????????????????????????????????????<strong>{{?$errors->first('name')?}}</strong> ????????????????????????????????????</span> ????????????????????????????????????@endif ????????????????????????????????</div> ????????????????????????????</div> ????????????????????????????<div>has('password')???'?has-error'?:?''?}}"> ????????????????????????????????<label>Password</label> ????????????????????????????????<div> ????????????????????????????????????<input> ????????????????????????????????????@if?($errors->has('password')) ????????????????????????????????????????<span> ????????????????????????????????????????<strong>{{?$errors->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'=>'yzha5', ????????????'password'=>?bcrypt('123456') ????????]); ????} DatabaseSeeder.php $this->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'?=>?AppHttpMiddlewareRedirectIfAdminAuthenticated::class, ????????... ????]; 更改admin路由,將guest:admin改為admin.guest:admin Route::get('login','AdminAuthLoginController@showLoginForm') ????->middleware('admin.guest:admin') ????->name('admin.login.show'); Route::post('login','AdminAuthLoginController@postLogin') ????->middleware('admin.guest:admin') ????->name('admin.login.post');