Laravelの認証に独自テーブルを利用

参考書そのままやっただけ。

config/auth.php

guardsキー

guardsキーの配列にあるdriverで指定するのは、
Illuminate\Contracts\Auth\Guardインターフェイスを実装したクラスである必要がある。

providersキー

providersキーの配列にあるdriverで指定するのは、
Illuminate\Contracts\Auth\UserProviderインターフェイスを実装したクラスである必要がある。

(Eloquentやクエリビルダ以外のアクセス方法が必要な場合は独自でproviderを実装する)
(もしくはまだおそらくだけど、ID とパスワードと他の要素で認証する場合にproviderを実装する)

UserProviderインターフェイスのメソッドのうち何個かは、
Illuminate\Contracts\Auth\Authenticatableインターフェイスを実装したクラスのインスタンスを引数に指定する必要がある。

usersテーブルの列定義のみ変更し、認証スカフォールドを利用しない場合

標準の場合、Eloquentを使うことになる。
列を標準から変更し、name列とpassword列を利用して認証する場合。

下記のようにHash::makeを利用し、ハッシュ化したパスワードを準備する。

// Tinkerを利用すると楽。
> Hash::make('password');

次に下記のSQLでデータをusersテーブルへ挿入する。

INSERT INTO users(name, password)
VALUES ('testname', 'パスワードをハッシュ化した文字列');

次にTinkerで下記コードを実行し、trueが返ってきたら認証できたと判断できる。

> $credentials['name'] = 'testname';
> $credentials['password'] = 'password';
> Auth::attempt($credentials);

usersテーブルを利用し、クエリビルダを利用するよう設定

config/auth.php を次のように変更する。

'providers' => [
//        'users' => [
//            'driver' => 'eloquent',
//            'model' => App\Models\User::class,
//        ],

         'users' => [
             'driver' => 'database',
             'table' => 'users',
         ],
    ],

その後、usersテーブルを利用してログインすることができる。

追いかけたい時に読むファイル

  • クエリビルダ
    Illuminate\Auth\DatabaseUserProvider.php
  • Eloquent
    Illuminate\Auth\EloquentUserProvider.php

クエリビルダを利用し、独自テーブルの情報で認証する

テーブル

-- テーブル作成。
CREATE TABLE family_users (
    id bigserial primary key,
    name varchar(100) unique not null,
    password varchar(100) not null
);

-- データ挿入。(パスワードはpassword)
INSERT INTO family_users(name, password)
VALUES ('test_name', '$2y$12$ZqcG966JqO/k3d8NO.tG/uPg8newms9y6EBiSYb9TGrSuHvzeJgSu';

作成するクラス

appフォルダ内にAuthフォルダを作成して配置する。

<?php

namespace App\Auth;

use Illuminate\Contracts\Auth\Authenticatable;

class AuthenticateUser implements Authenticatable
{

    protected $attributes;

    public function __construct(array $attributes)
    {
        $this->attributes = $attributes;
    }

    /**
     * @inheritDoc
     */
    public function getAuthIdentifierName(): string
    {
        return 'name';
    }

    /**
     * @inheritDoc
     */
    public function getAuthIdentifier()
    {
        return $this->attributes[$this->getAuthIdentifierName()];
    }

    /**
     * @inheritDoc
     */
    public function getAuthPassword()
    {
        return $this->attributes['password'];
    }

    /**
     * @inheritDoc
     */
    public function getRememberToken()
    {
        return $this->attributes[$this->getRememberTokenName()];
    }

    /**
     * @inheritDoc
     */
    public function setRememberToken($value)
    {
        $this->attributes[$this->getRememberTokenName()] = $value;
    }

    /**
     * @inheritDoc
     */
    public function getRememberTokenName()
    {
        // 自動ログインする時に編集する。
        return '';
    }
}

config/auth.php

編集箇所のみ記載。

'providers' => [
//        'users' => [
//            'driver' => 'eloquent',
//            'model' => App\Models\User::class,
//        ],

         'users' => [
             'driver' => 'database',
             'table' => 'family_users',
         ],
    ],

Tinkerで確認

> $credentials['name'] = 'test_name';
> $credentials['password'] = 'password';
> Auth::attempt($credentials);

trueが返ってきたら認証成功となる。

コメント

タイトルとURLをコピーしました