ラボ > FuelPHP:auth関連、Laravel、Lumen:ユーザー認証関連

laravel8 運用中のAUTH関連のユーザーテーブルをlaravelでどうにかしたい

FuelPHPからlaravelに移行させたいけど、ユーザー認証が面倒。laravel用のユーザーテーブルを新規作成。

作成日:2023-06-30, 更新日:2023-07-06

方針

出来る限りラクしたいし、複雑なコトもしたくない

ひとまず…

  • 「旧ユーザー情報(FuelPHP)」 - FuelPHP時代に作成した情報
  • 「新ユーザー情報(laravel)」 - 新たにlaravelで作成した情報

やらないコト

FuelPHP時代に作成したテーブルをlaravelでそのまま使うってコトはしない

やるコト

FuelPHP時代に作成したテーブルをlaravelで作成したテーブルにデータを移行してから、使う

laravel移行後のユーザーのログインについて

  1. ユーザーが「旧ユーザー情報(FuelPHP)」でログインする
  2. ログイン成功したら、パスワードの再設定をしてもらう
  3. 次回以降はパスワードの再設定は不要

laravel移行後のユーザーのログインの処理

  1. 「旧ユーザー情報(FuelPHP)」のテーブルを「テーブル: users」に移植
  2. どっかに「旧ユーザー情報(FuelPHP)」であるというフラグを立てておく
  3. ユーザーが「旧ユーザー情報(FuelPHP)」でログインする
  4. ユーザーネームより「旧ユーザー情報(FuelPHP)」か「新ユーザー情報(laravel)」を判別
  5. 「旧ユーザー情報(FuelPHP)」のとき
    1. FuelPHP用のログイン処理実行
    2. ログイン成功したら、パスワードの再設定をしてもらう → 「テーブル: users」のパスワードを書換え
    3. どっかに「新ユーザー情報(laravel)」に切り替えたってフラグを立てておく

既存のユーザーテーブルをlaravelのユーザーテーブルにinsert

INSERT INTO users (
    id,
    name,
    email,
    email_verified_at,
    password,
    remember_token,
    created_at,updated_at
)
SELECT
    〇〇〇, # users.id
    〇〇〇, # users.name
    〇〇〇, # users.email
    CURRENT_DATE(), # users.email_verified_at
    password, # users.password
    '', # users.remember_token
    〇〇〇, # users.created_at
    〇〇〇 # users.updated_at
FROM 〇〇〇
where 〇〇〇

FuelPHPのログイン処理

「\Auth::login()」から辿っていく
※simpleauthなら「packages/auth/classes/auth/login/simpleauth.php」の中っぽい

メモ

以下が正解なのかは知らない。ひとまず対応させるための手順

  1. 方針
  2. laravelが用意している「テーブル: users」に「カラム: group」を追加
  3. FuelPHPのユーザーテーブルからlaravelの「テーブル: users」にデータをinsert
  4. ログイン処理でパスワードの再設定をしているかチェック

方針

FuelPHPからlaravelに移行後にパスワードの再設定をしていない場合は再設定をさせたい
→何かしらのフラグを立てても良いんだけど面倒なのでユーザーグループで対応

▼FuelPHP側のユーザーグループが「管理者=1、ユーザー=2」としていた場合の例

  • パスワードの再設定をしていない管理者 = 11
  • パスワードの再設定をしていないユーザー = 12
  • パスワードの再設定をした管理者 = 1
  • パスワードの再設定をしたユーザー = 2

※単純に「+10」されているかどうかで判別させる

laravelが用意している「テーブル: users」に「カラム: group」を追加

やることは「マイグレーションファイルを作成」と「マイグレーション実行」の2つ

マイグレーションファイルを作成

▼modelは不要なので「--table」にする

$ ./vendor/bin/sail php artisan make:migration add_group_to_users --table=users

※対象は「テーブル: users」。ファイル名は「add_group_to_users」とする

▼作られるファイル

  • database/migrations/20xx_xx_xx_xxxxxx_add_group_to_users.php

▼「20xx_xx_xx_xxxxxx_add_group_to_users.php」の修正

~ 略 ~
public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->integer('group')->unsigned()->default(0)->after('password')->comment('');
    });
}

~ 略 ~
public function down(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('group');
    });
}
~ 略 ~

マイグレーション実行

$ ./vendor/bin/sail php artisan migrate

FuelPHPのユーザーテーブルからlaravelの「テーブル: users」にデータをinsert

INSERT INTO users (
    id,
    name,
    email,
    email_verified_at,
    password,
    `group`,
    remember_token,
    created_at,updated_at
)
SELECT
    〇〇〇, # users.id
    〇〇〇, # users.name
    〇〇〇, # users.email
    CURRENT_DATE(), # users.email_verified_at
    password, # users.password
    `group`+10, # users.group
    '', # users.remember_token
    〇〇〇, # users.created_at
    〇〇〇 # users.updated_at
FROM 〇〇〇
where 〇〇〇

ログイン処理でパスワードの再設定をしているかチェック

ログイン時に「users.group」で再設定済みか判別

メモ: fuelPHPのユーザーテーブルをlaravelに移植

上記では…「パスワード再設定ページに飛ばす」としたけど…「ログイン時にパスワードを更新」とするほうが利用者にとってラクだと思う

  • ユーザーグループは欲しい
  • FuelPHPのパスワードできたとき、laravelのパスワードに置換えたい
  • 任意のタイミングで全端末から強制ログアウトさせたい
  • usernameでもログインさせたい

作業内容

laravelのユーザーテーブルにカラム追加、ユニーク設定

  • usersテーブルに「カラム: usergroup」を追加。型はfuelPHP側と同じにしておく
  • usersテーブルに「カラム: comparison_at」を追加。全端末から強制ログアウトさせるためのフラグ代わり。date()よりtime()の方が比較がラクなので…int型にしておく
  • usersテーブルの「カラム: name」をユニークに指定

fuelPHPのユーザーテーブルの中身をlaravelのユーザーテーブルにinsert

INSERT INTO users (
    id,
    name,
    email,
    email_verified_at,
    password,
    usergroup,
    remember_token,
    comparison_at,
    created_at,
    updated_at
)
SELECT
    id, # users.id
    username, # users.name
    email, # users.email
    CURRENT_DATE(), # users.email_verified_at
    password, # users.password
    `group`+100, # users.usergroup。パスワードをlaravel用に更新したかのフラグを追加しておく
    '', # users.remember_token
    0, # users.comparison_at
    from_unixtime(created_at), # users.created_at
    from_unixtime(updated_at) # users.updated_at
FROM labo_user
where 1

任意のタイミングで全端末から強制ログアウトさせたい

パスワード更新したとき以外にも好きなタイミングで「テーブル: users」を「users.comparison_at=time()」で更新

諸々の処理: laravel8 すべての端末からログアウトさせたい

FuelPHPのパスワードをlaravelのパスワードに書き換えたい

  1. ログイン処理の前にログインID、パスワードでデータ取得
  2. usergroupを確認し、更新が必要ならパスワードをlaravelでハッシュ化して保存
  3. 通常のログイン処理

laravelってのはパスワードは手動でハッシュ化するっぽい。
FuelPHPで出来ていたコトが色々と出来ないので結構、面倒…