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認証の実装手順

まずはじめに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をインストールできないときの対処方法

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

関連広告

コメント

コメントする

目次