用Laravel 原有的 Jetstream 做後台登入驗證
網上有很多比如Laraver-admin 等套件,但問題是我已購買左超多付費版的admin template 了,甚至dcat-admin 這套加強版,對我而言也沒有我所購買的收費版admin template的套件/功能整合做多
所以最終決定自行做一個後台,當然可放到同一個網站中運作,但我自認仍然是個Laravel的新手,所以就直接分2個網站(即2套ftp)來運作
既然都是想做獨立的後台,為什麼還要用 Laravel+Jetstream?
- 既然前台用Laravel,那麼Model都建好了,直接copy去後台就能完成大部分的數據庫操作
- 懶,Jetstream的安全性比我們大部分人寫出來的登入驗證都會更安全,比如他內置已跟google做了google authenticator
- 連前台都願意用Laravel,不怕他慢了...後台還怕什麼?更沒關系了
ps: 那麼遲才入坑Laravel 就是因為他慢,但一試便愛上,因為真的方便快捷
什麼是分開前台後台?
前台就是網址,比如abc.com 我指分成2個網站(ftp/hosting)就是指把他們放在"2個"不同的地方去運作 比後台後的網址是 admin.abc.com 或者你再買個網址做 abc-admin.com 也可以
只需要在.env 大家都指向同一個 Database就可以
正式開始
composer create-project laravel/laravel admincp
composer require laravel/jetstream
npm i
npm run watch
php artisan serve
php artisan jetstream:install livewire
然後我怎麼判斷他是管理員可前往後台?
去數字庫建了一張Table 名為 admin
id - int() AUTO_INCREMENT
user_id - bigint(20) UNSIGNED
level - int()
bigint(20) UNSIGNED 因為我做了外鍵綁定 Jetstream 建出來的user數據表的ID 外鍵不是必要的東西不一定做 level 是考慮到可能會有其他管理員,或者會做不同管理員級別
然後再新增一則數據
user_id=1 //對應你自己Jetstream
level=1 //隨便打的
帳號開好了,管理員的相關數據也開好了
我們建立一個hello page 做測試
Route::get('/hello', function () {
return view('hello');
})->middleware('auth');
已登入的可以看到,不能登入的就會把你退回login 畫面
問題來了,這時間即使你登入的不是id=1 你也能看到hello page,因為帳號對了就可登入
接下來就是修改Login controller 也是唯一跟平時用戶不一樣的重點
app/Providers/JetstreamServiceProvider.php
頂部引入4個class,把原來的留著不要刪
//因為要找到user當然要用到user model
use App\Models\User;
//因為要刻比密碼正確
use Hash;
//因為要獲取用戶輸入的email & password
use Illuminate\Http\Request;
//用Query Builder 去獲取 admin數據資料,你也可選擇建一個admin model
use Illuminate\Support\Facades\DB;
同一文件,找到function boot()
,修改為
public function boot() {
// $this->configurePermissions();
Fortify::authenticateUsing(function (Request $request) {
// 按照用戶輸入的電郵找到相關用戶資料,為主是為了id及password
$user = User::where('email', $request->email)->first();
//把找到的用戶id 拿來搜尋 admin 表中有沒有這個人
$admin_level = DB::table('admin')->where('user_id', '=', $user->id)->first();
if ($user &&
$admin_level && // 放行條件加入 需要找到admin 數據
Hash::check($request->password, $user->password)) {
return $user;
}
});
}
這是官方給我們的自定義登入而修改出來的
現在已完成了,id=1 的用戶可登入,但如果admin表中沒有的id,就會無法登入
補充少少
補充1 : middleware('auth')
因為這個網站,整站論理上都是後台,所以在routes/web.php
中每一則route最後都加上middleware('auth')
補充2:關閉不用的功能
都是後台了,怎麼能讓人註冊?
config/fortify.php
找到 features
把不可能用到的功能加上注解, 比如
// Features::registration(),