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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel 4

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

PHP

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

Q&A

解決済

2回答

6958閲覧

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

hotdoggy32

総合スコア63

Laravel 4

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

PHP

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

0グッド

2クリップ

投稿2014/09/13 12:14

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

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

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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などはお使いの環境に合わせて下さい

lang

1namespace App; 2 3use Illuminate\Auth\UserInterface; 4use Illuminate\Auth\EloquentUserProvider; 5 6class CustomUserProvider extends EloquentUserProvider 7{ 8 9 /** 10 * Validate a user against the given credentials. 11 * @param \Illuminate\Auth\UserInterface $user 12 * @param array $credentials 13 * @return bool 14 */ 15 public function validateCredentials(UserInterface $user, array $credentials) 16 { 17 $plain = $credentials['password']; 18 return ($plain === $user->getAuthPassword()); 19 } 20}

validateCredentialsで、データベースから取得したpasswordカラムの文字列と
入力されたpasswordを比較します

app/start/global.phpか、サービスプロバイダーで次の様にします

lang

1\Auth::extend('custom', function() { 2 return new \Illuminate\Auth\Guard( 3 new \App\CustomUserProvider( 4 new \Illuminate\Hashing\BcryptHasher, 5 \Config::get('auth.model') 6 ), 7 \App::make('session.store') 8 ); 9 });

customという名前のドライバーとして記述します
あとはapp/config/auth.phpなどでdriverを'custom'とすると
md5を利用して認証できる様になります

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

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

lang

1namespace App; 2 3use Illuminate\Auth\UserInterface; 4use Illuminate\Auth\DatabaseUserProvider; 5 6class CustomUserProvider extends DatabaseUserProvider 7{ 8 9 /** 10 * Validate a user against the given credentials. 11 * 12 * @param \Illuminate\Auth\UserInterface $user 13 * @param array $credentials 14 * @return bool 15 */ 16 public function validateCredentials(UserInterface $user, array $credentials) 17 { 18 $plain = $credentials['password']; 19 return ($plain === $user->getAuthPassword()); 20 } 21}

eloquentと同様に
app/start/global.phpか、サービスプロバイダーで次の様にします

lang

1\Auth::extend('custom', function() { 2 return new \Illuminate\Auth\Guard( 3 new \App\CustomUserProvider( 4 \DB::connection(), 5 new \Illuminate\Hashing\BcryptHasher, 6 \Config::get('auth.table') 7 ), 8 \App::make('session.store') 9 ); 10 });

あとは

lang

1\Auth::attempt([ 2 'username' => \Input::get('username'), 3 'password' => md5(\Input::get('password')) 4]);

または、validateCredentials内でmd5($credentials['password']) でもいいかもしれません

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

投稿2014/09/14 15:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotdoggy32

2014/09/17 07:56

実装例を用いてすごく丁寧に説明して頂き、やり方を理解することが出来ました。 是非、参考にしたいと思います。回答ありがとうございました!!
guest

0

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

lang

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

投稿2014/09/14 02:30

hogehogehoge

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問