前言
本文主要給大家介紹了通過修改Laravel Auth用salt和password進行認證用戶的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細的介紹:
Laraval自帶的用戶認證系統(tǒng)Auth非常強大易用,不過在Laravel的用戶認證系統(tǒng)中用戶注冊、登錄、找回密碼這些模塊中用到密碼加密和認證算法時使用的都是bcrypt,而很多之前做的項目用戶表里都是采用存儲salt + password加密字符串的方式來記錄用戶的密碼的,這就給使用Laravel框架來重構(gòu)之前的項目帶來了很大的阻力,不過最近自己通過在網(wǎng)上找資料、看社區(qū)論壇、看源碼等方式完成了對Laravel Auth的修改,在這里分享出來希望能對其他人有所幫助。 開篇之前需要再說明下如果是新項目應(yīng)用Laravel框架,那么不需要對Auth進行任何修改,默認的bcrypt加密算法是比salt + password更安全更高效的加密算法。
修改用戶注冊
首先,在laravel 里啟用驗證是用的artisan命令
php artisan make:auth
執(zhí)行完命令后在routes文件(位置:app/Http/routes.php)會多一條靜態(tài)方法調(diào)用
Route::auth();
這個Route是Laravel的一個Facade (位于Illuminate\Support\Facades\Route), 調(diào)用的auth方法定義在Illuminate\Routing\Router類里, 如下可以看到auth方法里就是定義了一些Auth相關(guān)的路由規(guī)則
/** * Register the typical authentication routes for an application. * * @return void */ public function auth() { // Authentication Routes... $this->get('login', 'Auth\AuthController@showLoginForm'); $this->post('login', 'Auth\AuthController@login'); $this->get('logout', 'Auth\AuthController@logout'); // Registration Routes... $this->get('register', 'Auth\AuthController@showRegistrationForm'); $this->post('register', 'Auth\AuthController@register'); // Password Reset Routes... $this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm'); $this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail'); $this->post('password/reset', 'Auth\PasswordController@reset'); }
通過路由規(guī)則可以看到注冊時請求的控制器方法是AuthController的register方法, 該方法定義在\Illuminate\Foundation\Auth\RegistersUsers這個traits里,AuthController在類定義里引入了這個traits.
/** * Handle a registration request for the application. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function register(Request $request) { $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException( $request, $validator ); } Auth::guard($this->getGuard())->login($this->create($request->all())); return redirect($this->redirectPath()); }
在register方法里首先會對request里的用戶輸入數(shù)據(jù)進行驗證,你只需要在AuthController的validator方法里定義自己的每個輸入字段的驗證規(guī)則就可以
protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:user', 'password' => 'required|size:40|confirmed', ]); }
接著往下看驗證通過后,Laravel會掉用AuthController的create方法來生成新用戶,然后拿著新用戶的數(shù)據(jù)去登錄Auth::guard($this->getGuard())->login($this->create($request->all()));
所以我們要自定義用戶注冊時生成用戶密碼的加密方式只需要修改AuthController的create方法即可。
比如:
/** * Create a new user instance after a valid registration. * * @param array $data * @return User */ protected function create(array $data) { $salt = Str::random(6); return User::create([ 'nickname' => $data['name'], 'email' => $data['email'], 'password' => sha1($salt . $data['password']), 'register_time' => time(), 'register_ip' => ip2long(request()->ip()), 'salt' => $salt ]); }
修改用戶登錄
修改登錄前我們需要先通過路由規(guī)則看一下登錄請求的具體控制器和方法,在上文提到的auth方法定義里可以看到
$this->get('login', 'Auth\AuthController@showLoginForm'); $this->post('login', 'Auth\AuthController@login'); $this->get('logout', 'Auth\AuthController@logout');