今回、初めて、usersテーブル以外の別のテーブルで認証をする機能を作成したので、メモがてら記事にしておきます。
今回やろうとしたことは、laravelが標準で用意してくれているusersテーブル
ではなく、自分で作成したaccountsテーブル
で認証することです。
テーブルの中身は結果的に標準装備のusersテーブル
と同じになってしまいました。(標準のusersテーブルは別で使いました)
マイグレーションファイルと、モデルを作成
Modelとマイグレーションファイルを同時に作成していきます。
$ php artisan make:Model Account --migration
## まずはマイグレーションファイルから作成
標準装備のusersテーブルとカラムが一緒なので、ここはそんな見る必要ないです。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAccountsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('accounts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('accounts');
}
}
そしてモデルの作成
こちらも標準装備のUser.php
と同じなんですけど、注意点が1個だけあります。
それは、普通にModelを作成するとClass 〇〇〇〇 extends Model
になると思いますが、認証機能として使いたい場合、Class 〇〇〇〇 extends Authenticatable
にする必要があります。
そして、extends Authenticatable
をするために、use Illuminate\Foundation\Auth\User as Authenticatable;
の記述が必要です。
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; // ←←←← 注目
class Account extends Authenticatable // ←←←← 注目
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
設定の変更
認証機能の設定はconfig/auth.php
で行なっています。
'defaults' => [
'guard' => 'web',
'passwords' => 'accounts', // usersからaccountsに変更
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'accounts', // usersからaccountsに変更
],
'api' => [
'driver' => 'token',
'provider' => 'accounts', // usersからaccountsに変更
'hash' => false,
],
],
'providers' => [
'accounts' => [ // usersからaccountsに変更
'driver' => 'eloquent',
'model' => App\Account::class, // App\UsersからApp\Accountsに変更
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
'passwords' => [
'accounts' => [
'provider' => 'accounts', // usersからaccountsに変更
'table' => 'password_resets',
'expire' => 60,
],
],
毎回全部を変更すれば良いわけではないと思いますが、今回は標準装備のusersテーブルの認証と全く同じものをaccountsテーブルで実装したかっただけなので、これでOKです!
実際にログインしてみたら完璧にできました!
追記:Registerの方でエラーが出たので修正した
ログインは上記の流れでOK何ですけど、登録の方でエラーが出てしまった。
まずは、registerController.phpで、会員登録したらusersテーブルではなく、accountsテーブルに入って欲しいので、
use App\Account; // ←←←これを追加 use App\User;は削除
protected function create(array $data)
{
return Account::create([ // UserからAccountに変更
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
これでOK
そして、バリデーションのところも修正する必要があります。
(これ探すのにちょー時間かかった)
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:20'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:accounts'], // 'unique:users'から'unique:accounts'に変更
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
これで会員登録の方も、usersテーブルではなくaccountsテーブルでできるようになります!