こんにちは!
今回は、Laravelでデータベース内の別テーブルでログインを切り替える方法を紹介します。
マイグレーションファイルの作成
まずは下記のコマンドでマイグレーションファイルを作成します。
1 |
php artisan make:model AdminUsers --migration |
上記のコマンドを実行することで、マイグレーションファイルとモデルファイルが生成されます。
モデルファイルの記述
モデルファイルを作成できたら、下記のように変更しておきます。
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; class AdminUsers extends Authenticatable { // } |
これを記述することで下記のエラーを回避できます。
「Argument 1 passed to Illuminate\Auth\EloquentUserProvider::validateCredentials() must be an instance of Illuminate\Contracts\Auth\Authenticatable」
マイグレーションファイルの記述
生成されたことを確認したら、今度はマイグレーションファイルを開いて編集しましょう。
データベースの項目を決める「up()」の箇所を下記のように編集しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * Run the migrations. * * @return void */ public function up() { Schema::create('admin_users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->timestamp('email_verified_at')->nullable(); $table->timestamps(); }); } |
編集ができたら、下記のコマンドでDB項目を新しく作成します。
1 |
php artisan migrate |
管理ユーザーの作成
migrationコマンドで、新しくテーブルの作成ができたら、今度は仮の管理ユーザーを追加します。
仮のユーザーは、Laravelのfactoryを使って作成しましょう。
factoryは下記のコマンドで生成します。
1 |
php artisan make:factory AdminUserFactory |
生成ができたら、ファイルを開いて下記のように記載します。
1 2 3 4 5 6 7 |
$factory->define(App\AdminUsers::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => Hash::make('admin'), ]; }); |
上記コードのHash::makeのところで、「admin」というパスワードに設定してあります。
設定ができたら、今度はプロジェクト直下のところまで移動して、下記のコマンドを実行します。
1 |
php artisan tinker |
すると下記のようにコマンド実行モードみたいな形になるので、その中で下記のコマンドでユーザーを作成しましょう。
1 |
factory(App\AdminUsers::class, 1)->create(); |
Laravel6系を使っていると、下記のようにエラーが出ます。
Call to undefined function str_random()
なので、手動でヘルパーを入れましょう。
1 |
composer require laravel/helpers |
うまく作成できると、下記のような画面が表示されます。
admin_usersテーブルを使って管理者ログイン
仮のユーザーが作成できたら、今度はそのユーザーを使って管理者ログインを実装します。
管理者ログインでは、下記の手順で実装していきます。
・専用のmiddlewareを作成。
・guardsに登録
専用のmiddlewareを作成
専用のmiddlewareは下記のコマンドで実行します。
1 |
php artisan make:middleware Admin |
作成ができたら、中を下記のように変更しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#useでAuthを追加。 use Auth; /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if( Auth::guard('admin')->check() ){ return $next($request); } ##ここは任意のものに変更しましょう。 return redirect()->route('sign_admin_login')->with('error', '権限がありません'); } |
変更ができたら、Kernel.phpの「routeMiddleware」の箇所に変更を加えます。
1 2 3 4 5 6 |
protected $routeMiddleware = [ 'admin' => \App\Http\Middleware\Admin::class ・ ・ ・ ] |
登録ができたら、制御したい箇所のコントローラーの「__construct」の部分にmidllewareを追加します。
1 2 3 4 |
public function __construct() { $this->middleware('admin'); } |
guardsに登録
追加ができたら、今度は「guards」に登録します。
「gurads」は「auth.php」の箇所に存在するので、そこで設定します。
下記のように追加しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admin_users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], ], |
同じファイル内に「providers」という項目があります。
そこに、下記のように追加しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ##追加 'admin_users' => [ 'driver' => 'eloquent', 'model' => App\AdminUsers::class, ], ##追加 // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], |
管理者専用ログインコントローラーの作成
ここまで設定したら、最後に管理者専用コントローラーを作成します。
下記のコマンドでコントローラーを作成しましょう。
1 |
php artisan make:controller AdminLoginController |
作成したら中身は下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Auth; class AdminLoginController extends Controller { public function index(){ #ここは各自で設定してください。 return view('admin.login.login'); } public function signInAdmin(CreateAdminUserLoginRequest $request) { if(Auth::guard('admin')->attempt( ['email'=>$request['email'], 'password'=>$request['password']] ) ) { #繊維したいページを指定。 return redirect()->route('admin'); } #繊維したいページを指定。 return redirect()->route('admin_login'); } } |
遷移するページ先として、AdminControllerも作成しておきます。
1 |
php artisan make:controller AdminController |
作成したら、middlewareを指定して、中身を下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class AdminController extends Controller { public function __construct() { ##管理者ログインのみ許可する。 $this->middleware('admin'); } public function index(){ dd('admin_page'); } } |
今度は、ログインのViewを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Laravel Excel Form Upload</title> </head> <body> <p class="login-box-msg">ログインしてください。</p> <form action="{{ route('admin_sign_in') }}" method="post"> @csrf <input name="email" type="email" class="form-control" placeholder="Email" value="{{ old('email') }}"> <input name="password" type="password" class="form-control" placeholder="Password"> <!-- /.col --> <div class="col-xs-4"> <button type="submit" class="btn btn-primary btn-block btn-flat">ログイン</button> </div> </form> </body> </html> |
あとはルーティングを下記のようにします。
1 2 3 |
Route::get('/admin/login', 'AdminLoginController@index')->name('admin_login'); Route::post('/admin/login', 'AdminLoginController@signInAdmin')->name('admin_sign_in'); Route::get('/admin', 'AdminController@index')->name('admin'); |
現状の状態で「/admin」にアクセスしようとすると、おそらく「/admin/login」にリダイレクトされます。
ログイン画面で先程作成した、フェイクのユーザーのメールアドレスとパスワード(admin)でログインしてましょう。
すると、下記のようにうまくログインできると思います。
ログアウトについて
とりあえず、手軽にログアウト処理を入れておきたい場合は、下記のように「web.php」に記述しましょう。
1 2 3 4 5 6 |
Route::get('/admin/logout', function () { Auth::guard('admin')->logout(); return redirect('/admin/login'); }); |
「/admin/logout」にアクセスすると、ログアウトされます。
まとめ
今回はLaravelでデータベース内の別テーブルでログインを切り替える方法を紹介しました。
今回の記事があなたの役に立てたら嬉しいです。