laravel5.1でusersテーブル以外を認証情報として使う方法
1, 前提条件として、laravelではユーザ認証をusersテーブルで行うように実装されている
2, usersテーブル以外のテーブルを使う & laravel既存のユーザ認証を使う場合は、id,email,passwordの3カラムが必須となる。
※1 emailとpasswordだけでもログインフォームはパス出来たけど、id無しだと次ページ以降はログイン状態を維持できない(認証のためにsessionに書き込むIDが無い?)
※2 username, remember_token, timestampsは、無くても行けた。
3, 今回は、以前にやったみたいに2つのテーブルを結合したviewをusersテーブルの代わりに使う。
他に認証情報は無いので、database/migration/xxxxxxx_create_users_table.phpに、直接 create 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { public function up() { DB::statement( 'DROP VIEW IF EXISTS users' ); DB::statement( "CREATE VIEW users AS select concat('table_a_' , id) as id, -- table_bと教室テーブルと重複しないようにプレフィックス付与 login_id as username, password as password, -- passwordはbcrypt()でハッシュ化しておく email_address as email from table_a union select concat('table_b_' , id) as id, -- table_aと重複しないようにプレフィックス付与 login_id as username, password as password, -- passwordはbcrypt()でハッシュ化しておく mail_address as email from table_b " ); /* 従来のusersテーブルはコメントアウトする Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password', 60); $table->rememberToken(); $table->timestamps(); }); */ } /** * Reverse the migrations. * * @return void */ public function down() { //Schema::drop('users'); DB::statement( 'DROP VIEW IF EXISTS users' ); } } |
4, php artisan migrate:refresh –seed でテーブルを作り直す。
これだけでtable_aかtable_bにあるユーザ情報で、laravel標準のユーザ認証が使えるようになる。
1 2 3 4 5 6 7 8 9 10 |
// route.php Route::get('/login_check', function () { if (Auth::check()) { $user = Auth::user(); return $user; }else{ return 'Not login'; } }); |
5, auth::logout()を実行するとremember_tokenがアップデート出来ないよ~というエラーになる。unionしたviewなので当然出来ないのだが…。
update文を実行している場所を探すと vendor/laravel/framework/src/Illuminate/Auth/Guard.php 内を更新したら、エラーが出ずにログアウトできた。
※1, usersテーブルのremenber_tokenは、再ログイン時に自動的にログインするためのもの。ブラウザのクッキーに保存しておいて、同じハッシュ値なら認証となる。
※2, vendorフォルダ以下は、composer updateでパッケージを上書きされるので、project側でメソッドをオーボーライドしないとダメ! 後でやっておこう…。
1 2 3 4 5 6 |
protected function refreshRememberToken(UserContract $user) { $user->setRememberToken($token = Str::random(60)); // 更新しない! // $this->provider->updateRememberToken($user, $token); } |
6, ログインIDはemailカラムではなく、usernameカラムに変更
a, login.blade.phpの入力フォームのnameをemailからusername変更
b, App\Http\Controllers\Auth\AuthControllerに変数を追加
1 |
protected $username = 'username'; |