以前、既存のユーザーデータを利用したログイン認証の仕組みを構築する機会がありました。
そのときの実装方法を記事としてまとめました。
もしLaravel環境でMD5ハッシュデータ認証を実装したい方は参考にどうぞ。
環境
CentOS 7.6
PostgreSQL 10.4
PHP 7.2.5
Composer version 1.8.4
Laravel Framework 5.8.10
既存ユーザーデータ(テーブル)
スキーマ名 public
テーブル名 members
カラムの種類 member_cd int, password varchar, member_name varchar
【補足】member_cdをログインIDとし、passwordをログインパスワードとして利用する。
MD5認証の実装手順
まずはじめにMD5用のハッシャーを新規で作成します。
ポイントは、「\Illuminate\Contracts\Hashing\Hasher」をimplementsすることです。
app/Services/MD5Hasher.php
<?php namespace App\Services; use RuntimeException; class MD5Hasher implements \Illuminate\Contracts\Hashing\Hasher { public function info($hashedValue){ return $hashedValue; } public function make($value, array $options = []) { return md5($value); } public function check($value, $hashedValue, array $options = []) { return (md5($value) == $hashedValue); } public function needsRehash($hashedValue, array $options = []) { return false; } }
次に、MD5ハッシャーのサービスプロバイダを新規で作成します。
app/Providers/MD5HasherServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Services\MD5Hasher; class MD5HasherServiceProvider extends ServiceProvider { protected $defer = true; public function register() { $this->app->singleton('hash', function() { return new MD5Hasher; }); } public function provides() { return ['hash']; } }
次に、Laravelフレームワーク上で利用するハッシャーの種類を、既存のハッシャーから今回新たに作成したMD5ハッシャーに変更します。
config/app.php
※一部抜粋(★の箇所のみ変更する)
/* |-------------------------------------------------------------------------- | Autoloaded Service Providers |-------------------------------------------------------------------------- | | The service providers listed here will be automatically loaded on the | request to your application. Feel free to add your own services to | this array to grant expanded functionality to your applications. | */ 'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, Illuminate\Cache\CacheServiceProvider::class, Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, Illuminate\Cookie\CookieServiceProvider::class, Illuminate\Database\DatabaseServiceProvider::class, Illuminate\Encryption\EncryptionServiceProvider::class, Illuminate\Filesystem\FilesystemServiceProvider::class, Illuminate\Foundation\Providers\FoundationServiceProvider::class, // Illuminate\Hashing\HashServiceProvider::class, ★コメントアウト(既存のハッシャー機能を無効化する) App\Providers\MD5HasherServiceProvider::class, ★追記(前手順で作成したサービスプロバイダを有効化する) Illuminate\Mail\MailServiceProvider::class, Illuminate\Notifications\NotificationServiceProvider::class, Illuminate\Pagination\PaginationServiceProvider::class,
次にUserモデルを既存のテーブルに合わせて変更します。
app/User.php
※以下、追記した部分のみ表記しています
「protected $fillable」や「protected $hidden」は既存のテーブルに合わせて修正してください。
// 既存テーブル名を指定 protected $table = 'public.members'; // 認証時のログインIDで使用するカラム名を指定 public function getAuthIdentifierName() { return 'member_cd'; } // 標準で実装されている継続ログイン機能でエラーが発生するのを防ぐために記述する public function setRememberToken($value) { return $this; } // 既存テーブルからMD5ハッシュ化されたパスワード情報を返すメソッド public function getAuthPassword() { $hash_pass = $this->password; return $hash_pass; }
次にログインフォーム(Bladeテンプレート)を修正します。
修正内容は”email”と”password”のキーワード部分を、今回利用するテーブルの情報に合わせて修正します。
(例)当記事の場合、下記のようにinput要素を修正します
【Before】
<input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>
【After】
<input id="member_id" type="member_cd" class="form-control{{ $errors->has('member_cd') ? ' is-invalid' : '' }}" name="member_cd" value="{{ old('member_cd') }}" required autofocus>
★注意点
Laravelのバージョンによっては、BladeテンプレートでFormタグを利用できない場合があるようです。
私もFormタグを利用しようとしたらエラーが発生しました。
そのため、下記の対応を実施し解決しました。
composer.json内に「”laravelcollective/html”: “^5.8″」を一文追記する。
"require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", "laravel/framework": "5.8.*", "laravel/tinker": "^1.0", "laravelcollective/html": "^5.8" ←この1文を追記した },
ファイルを保存後、composer updateコマンドを実行する。
以上で、既存テーブルを利用したログイン認証が実現できました。
一部の設定(データベースの接続設定など)は割愛しましたが、きっとLaravel利用者であれば問題ないと思います。
また既存テーブルを利用した認証のみであれば、新たにマイグレーションやシーダーの実行は不要です。
既存システムとの連携などでMD5ハッシュ認証が必要な場合は参考にしてください。
CentOS7に最新のLaravelをインストールできないときの対処方法
コメント