質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • PHP

    20847questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 4

    220questions

    Laravel 4 とはTaylor Otwellによって開発された、オープンソースなPHPwebアプリケーション開発フレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

【PHP】Laravel 4の認証でHash::make()の代わりにmd5を使う方法

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 3,633

hotdoggy32

score 78

サイトをLaravelへ切り替えようとしています。
古いサイトには、複数人のユーザーが入っており、それぞれのユーザーにはmd5ハッシュがパスワードとして付いています。

Laravelに変更する上で、Auth::attemptを使いたいのですが、どうもパスワードストリングをハッシュするために独自のメソッドを使っているようなのです。ユーザー全員にパスワードを変えさせるのは避けたいです。

それを避けるためにAuth classmd5を使わせる方法はありますか?
もしあるのであれば、やり方を教えていただけると大変ありがたいです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

Auth::attemptをmd5に対応させる場合は、メソッドをオーバーライドするだけで対応できます

まずattemptで実行される処理の流れを把握しておきましょう
Illuminate\Auth\Guardにありますが、
まず、指定している認証ドライバーのretrieveByCredentials()が実行されます
この処理内でDBにアクセス(eloquent, database両ドライバー共に)しますが、
passwordカラムはこの時の検索から除外されます
取得したデータはIlluminate\Auth\UserInterfaceを実装したオブジェクトです

その後に指定している認証ドライバーのvalidateCredentialsで、
取得したオブジェクトにあるpasswordと入力されたパスワードが、
\Illuminate\Hashing\BcryptHasherのメソッドを使って正しい入力情報かどうかを判定します。

今回はこの部分を\Illuminate\Hashing\BcryptHasherからmd5に変更します

eloquentドライバーを利用する場合
EloquentUserProviderを継承します
データベースのpasswordカラムにmd5を介した文字列が保存されているとした例です
namespaceなどはお使いの環境に合わせて下さい

namespace App;

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\EloquentUserProvider;

class CustomUserProvider extends EloquentUserProvider
{

    /**
     * Validate a user against the given credentials.
     * @param  \Illuminate\Auth\UserInterface  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserInterface $user, array $credentials)
    {
        $plain = $credentials['password'];
        return ($plain === $user->getAuthPassword());
    }
}
validateCredentialsで、データベースから取得したpasswordカラムの文字列と
入力されたpasswordを比較します

app/start/global.phpか、サービスプロバイダーで次の様にします
\Auth::extend('custom', function() {
        return new \Illuminate\Auth\Guard(
            new \App\CustomUserProvider(
                new \Illuminate\Hashing\BcryptHasher,
                \Config::get('auth.model')
            ),
            \App::make('session.store')
        );
    });
customという名前のドライバーとして記述します
あとはapp/config/auth.phpなどでdriverを'custom'とすると
md5を利用して認証できる様になります

\Illuminate\Hashing\BcryptHasherは不要ですが、
この例ではvalidateCredentialsだけをオーバーライドしますので、コンストラクタに含めています
不要な場合はEloquentUserProviderを継承せずに独自のドライバとして実装して下さい

databaseドライバーを利用する場合
ほとんど同じです
namespace App;

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\DatabaseUserProvider;

class CustomUserProvider extends DatabaseUserProvider
{

    /**
     * Validate a user against the given credentials.
     *
     * @param  \Illuminate\Auth\UserInterface  $user
     * @param  array  $credentials
     * @return bool
     */
    public function validateCredentials(UserInterface $user, array $credentials)
    {
        $plain = $credentials['password'];
        return ($plain === $user->getAuthPassword());
    }
}
eloquentと同様に
app/start/global.phpか、サービスプロバイダーで次の様にします
\Auth::extend('custom', function() {
        return new \Illuminate\Auth\Guard(
            new \App\CustomUserProvider(
                \DB::connection(),
                new \Illuminate\Hashing\BcryptHasher,
                \Config::get('auth.table')
            ),
            \App::make('session.store')
        );
    });

あとは
\Auth::attempt([
    'username' => \Input::get('username'),
    'password' => md5(\Input::get('password'))
]);
または、validateCredentials内でmd5($credentials['password']) でもいいかもしれません

attemptでmd5を利用した認証は上記の様な実装になると思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/09/17 16:56

    実装例を用いてすごく丁寧に説明して頂き、やり方を理解することが出来ました。

    是非、参考にしたいと思います。回答ありがとうございました!!

    キャンセル

+3

MD5を使わせるのは非常に古い方法です。あえて維持しない方がいいと思います。
その代わりに、ユーザーが最初にログインし、Auth::attemptが失敗してしまったら、使おうとしていたパスワードをデータベースにあるものと、MD5として比較してみてください。
trueなら変更処理してログインさせれば、ユーザーの認証方法を移行できると思いますよ。

$user = new User::where('user_name','=',$_POST['user_name'])->first();
if(isset($user)) {
// ここでポストで来たパスワードをmd5にして比較
if($user->pass_word == md5($_POST['pass_word'])) { 
// ここでポストで来たパスワードを新しいハッシュに置き換え
$user->pass_word = Hash::make($_POST['pass_word']);
// セーブ
$user->save();
// ログイン処理
Auth::login($_POST['user_name']);
}
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20847questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 4

    220questions

    Laravel 4 とはTaylor Otwellによって開発された、オープンソースなPHPwebアプリケーション開発フレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

関連ワード: laravel 認証