サイトをLaravelへ切り替えようとしています。
古いサイトには、複数人のユーザーが入っており、それぞれのユーザーにはmd5ハッシュがパスワードとして付いています。
Laravelに変更する上で、Auth::attemptを使いたいのですが、どうもパスワードストリングをハッシュするために独自のメソッドを使っているようなのです。ユーザー全員にパスワードを変えさせるのは避けたいです。
それを避けるためにAuth classにmd5を使わせる方法はありますか?
もしあるのであれば、やり方を教えていただけると大変ありがたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
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
総合スコア165
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/09/17 07:56