参考资料:
How to use multiple authentication guards in a Laravel appLaravel Authentication目的
使 Laravel 除了原本 User
资料表外的资料表也可以当作纪录登入资讯使用。
一、 建立资料表
使用指令建立资料表:
php artisan make:migration create_admins_table
资料表内容如下:
public function up(){Schema::create('admins', function (Blueprint $table) {$table->id();$table->string('name');$table->string('username')->unique();$table->string('password');$table->rememberToken();$table->timestamps();});}
二、建立 Model
使用指令建立 Model:
php artisan make:model Admin
Model 内引入 Illuminate\Foundation\Auth\User
后将 extends 改为 Authenticatable
,并设置 $guard
,完整内容如下:
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Model;use Illuminate\Foundation\Auth\User as Authenticatable;class Admin extends Authenticatable{ use HasFactory; protected $guard = 'admin'; protected $fillable = [ 'name', 'username', 'password', ]; protected $hidden = [ 'password', 'remember_token', ];}
三、定义 guards
打开 config/auth.php
,并新增新的 guard 与 provider:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], ... 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ],
四、透用 Seeder 新增帐号
使用指令建立 Seeder:
php artisan make:seeder CreateAdmin
打开 database/seeders/CreateAdmin.php
,并加入:
use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Hash;...public function run(){DB::table('admins')->insert(['name' => 'admin','username' => 'admin','password' => Hash::make('123456'),]);}
然后运行上面写的 Seeder:
php artisan db:seed --class=CreateAdmin
五、建立登入
这边以 Livewire 为例:
namespace App\Http\Livewire\Auth;use Livewire\Component;use Illuminate\Support\Facades\Auth;class Login extends Component{ public $username; public $password; public $remember = false; protected $rules = [ 'username' => 'required', 'password' => 'required|min:6', ]; public function login() { if (Auth::guard('admin')->attempt($this->validate(), $this->remember)) { // 登入成功 return redirect('/posts'); } } public function render() { return view('livewire.auth.login') ->layout('layouts.base'); }}
六、限制路由
开启 routes/web.php
,并把要登入才能看得页面套上 middleware:
Route::middleware(['auth:admin', 'auth.session'])->group(function () { Route::get('/posts', App\Http\Livewire\Post\ShowPostList::class);});