基於Laravel/Jetstream做一個獨立後台

用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

然後我怎麼判斷他是管理員可前往後台?

去數字庫建了一張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(),