我正在将一个遗留应用程序移植到Laravel中。旧的应用程序使用MD5对密码进行无盐散列,所以我需要在Laravel中复制它。记录在案,我们正在用salt将密码更改为bcrypt,但这不是一个简单的过程,需要用户登录才能完成——与此同时,我只需要使用遗留哈希进行登录。
我遵循本指南将Auth::hash
转换为MD5:如何在Laravel 4中使用SHA1加密而不是BCrypt?
当我在注册帐户时用明文打印出密码和make
方法中生成的哈希时:
public function make($value, array $options = array()) {
echo $value.'<br>'.hash('md5', $value);
exit;
return hash('md5', $value);
}
我得到以下信息:
123456
e10adc3949ba59abbe56e057f20f883e
太好了,这正是我需要的。然而,当它被保存到数据库中时,我会得到一个完全不同的散列。我的猜测是Laravel在其他地方添加密码,但我找不到在哪里以及如何覆盖它。
我在app/libraries
:中的MD5Hasher.php
文件
<?php
class MD5Hasher implements Illuminate'Contracts'Hashing'Hasher {
/**
* Hash the given value.
*
* @param string $value
* @return array $options
* @return string
*/
public function make($value, array $options = array()) {
return hash('md5', $value);
}
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function check($value, $hashedValue, array $options = array()) {
return $this->make($value) === $hashedValue;
}
/**
* Check if the given hash has been hashed using the given options.
*
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function needsRehash($hashedValue, array $options = array()) {
return false;
}
}
我的MD5HashServiceProvider.php
:
<?php
class MD5HashServiceProvider extends Illuminate'Support'ServiceProvider {
/**
* Register the service provider.
*
* @return void
*/
public function register() {
$this->app['hash'] = $this->app->share(function () {
return new MD5Hasher();
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides() {
return array('hash');
}
}
我的AuthController.php
如下所示:
<?php
namespace App'Http'Controllers'Auth;
use Hash;
use App'User;
use Validator;
use Mail;
use App'Http'Controllers'Controller;
use Illuminate'Foundation'Auth'ThrottlesLogins;
use Illuminate'Foundation'Auth'AuthenticatesAndRegistersUsers;
class AuthController extends Controller
{
/*
|--------------------------------------------------------------------------
| Registration & Login Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users, as well as the
| authentication of existing users. By default, this controller uses
| a simple trait to add these behaviors. Why don't you explore it?
|
*/
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
//protected $redirectTo = '/account';
/**
* Create a new authentication controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest', ['except' => 'getLogout']);
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return 'Illuminate'Contracts'Validation'Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return User
*/
protected function create(array $data)
{
$this->redirectTo = '/register/step-1';
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
// email the user
Mail::send('emails.register', ['user' => $user], function($message) use ($user)
{
$message->to($user->email, $user->name)->subject('Edexus - Welcome');
});
// email the admin
Mail::send('emails.register-admin', ['user' => $user], function($message) use ($user)
{
$message->to('admins@***.com', 'Edexus')->subject('Edexus - New user sign up');
});
return $user;
}
}
查看用户模型中的密码转换器。在控制器中对密码进行哈希处理后,它将再次对其进行哈希处理。
我的建议是在creating()和updating()模型事件中散列密码一次,然后将其从赋值函数和控制器中删除。
步骤1:创建应用程序/库文件夹并将其添加到composer的自动加载中。classmap
"autoload": {
"classmap": [
// ...
"app/libraries"
]
},
步骤2:在app/libraries中创建两个php文件MD5Hasher.php和MD5HashServiceProviderMD5Hasher.php
<?php
namespace App'Libraries;
use Illuminate'Contracts'Hashing'Hasher;
class MD5Hasher implements Hasher {
/**
* Hash the given value.
*
* @param string $value
* @return array $options
* @return string
*/
public function make($value, array $options = array()) {
return md5($value);
}
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function check($value, $hashedValue, array $options = array()) {
return $this->make($value) === $hashedValue;
}
/**
* Check if the given hash has been hashed using the given options.
*
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function needsRehash($hashedValue, array $options = array()) {
return false;
}
}
MD5HashServiceProvider.php
<?php
namespace App'Libraries;
use Illuminate'Support'ServiceProvider;
class MD5HashServiceProvider extends ServiceProvider {
/**
* Register the service provider.
*
* @return void
*/
public function register() {
// $this->app['hash'] = $this->app->share(function () {
// return new MD5Hasher();
// });
$this->app->singleton('hash', function () {
return new MD5Hasher();
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides() {
return array('hash');
}
步骤3:隐藏或删除config/app.php中的"Illuminate''Hashing''HashServiceProvider::class",并添加"app''Libraries''MD5HashServiceProvider::class"