【PHP】Laravel 4の認証でHash::make()の代わりにmd5を使う方法
解決済
回答 2
投稿
- 評価
- クリップ 2
- VIEW 5,180
古いサイトには、複数人のユーザーが入っており、それぞれのユーザーにはmd5ハッシュがパスワードとして付いています。
Laravelに変更する上で、Auth::attemptを使いたいのですが、どうもパスワードストリングをハッシュするために独自のメソッドを使っているようなのです。ユーザー全員にパスワードを変えさせるのは避けたいです。
それを避けるためにAuth classにmd5を使わせる方法はありますか?
もしあるのであれば、やり方を教えていただけると大変ありがたいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+4
まず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を利用した認証は上記の様な実装になると思います
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
その代わりに、ユーザーが最初にログインし、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で質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
同じタグがついた質問を見る
関連ワード: laravel 認証
2014/09/17 16:56
是非、参考にしたいと思います。回答ありがとうございました!!