LaravelでMD5認証を行う方法(既存システムとの連携とかで使えます)

LaravelでMD5ハッシュ認証

以前、既存のユーザーデータを利用したログイン認証の仕組みを構築する機会がありました。

そのときの実装方法を記事としてまとめました。

もし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ハッシュ認証が必要な場合は参考にしてください。


WORDPRESS集客用WEBサイト最適化初期セットアップマニュアル

今なら特典で『WORDPRESSをWeb集客に最適化するためのマニュアル』付き!

Webで安定した集客を手に入れたい方へ
実践WEB集客メール講座
【無料】

この講座では、ライターやデザイナー、カウンセラーなどの個人起業家の方が、Webを利用して集客していくための仕組みの作り方を実践しながら学ぶことができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

15 − eight =

ABOUTこの記事をかいた人

Web集客コンサルタントとして、個人起業家やフリーランサーの方を対象にWebでの集客に悩んでいる方々の支援をしています。ライフワークでは、アウトドア(とくにキャンプ)にはまってます♪