LoginSignup
61
74

More than 3 years have passed since last update.

【Laravel】usersテーブルではない別のテーブルで認証をする

Last updated at Posted at 2020-01-11

今回、初めて、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テーブルでできるようになります!

61
74
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
74