laravel有自帶的登錄驗證
在laravel有自帶的登錄驗證。只要建立對應的表和配置一些文件就能夠使用,無需開發者自己去實現登錄邏輯。
第一步:配置方面
在config
下的auth.php
配置guards
和 providers
。 之后新建文件和數據庫名稱要和這里的對應。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
//Laravel Auth 驗證登錄
'member' => [
'driver' => 'session',
'provider' => 'member',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
//
'member' => [
'driver' => 'eloquent',
'model' => App\Models\Member::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
第二步:數據庫方面
1 .新建Member表,作為用戶表
2.模型中新建Member.php 文件對應,文件名稱取決於配置文件中的名稱
class Member extends Authenticatable
{
use HasFactory;
protected $table = 'xlyhb';
public $timestamps = false;
public $incrementing = false;
protected $guarded = [];
//protected $hidden = [];
public function getAuthPassword()
{
//return $this->attributes['pwdmd5'];
return $this->pwdmd5; //或其它名稱,以上兩種寫法都OK
}
}
第三步:控制器中使用
Auth::guard('Member')->attempt($credentials)); 嘗試登錄
Auth::guard($guard)->guest();判斷用戶是否來賓,可用於中間件,判斷用戶是否登錄,返回false,則已經登錄,反之,跳轉會登錄頁面
Auth::guard($guard)->user();獲取已經登錄的用戶信息,注意在__construct()中無法獲取,可以在中間件里面獲取
$credentials = $request->only('username', 'password');
/**
* 使用laravel自帶的Auth登錄
* 1、密碼使用的是hash加密 $crypt = password_hash($password, PASSWORD_DEFAULT);
*/
if(Auth::guard('admin')->attempt($credentials)){
return response()->json(['code' => 200, 'msg' => '登錄成功']);
}else{
return response()->json(['code' => 403, 'msg' => '用戶名或密碼錯誤']);
}
第四步:創建web中間件
php artisan make:middleware MemeberAuth
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class MemeberAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
//如果沒有指定的話,默認 guard 是 web,
//dump(Auth::guard($guard)->check()); 判斷用戶是否認證
//Auth::guard($guard)->user() 獲取用戶信息
//Auth::guard($guard)->guest() 是否是來賓
if(Auth::guard($guard)->guest()){
if($request->ajax() || $request->wantsJson()){
return response('Unauthorized.', 401);
}else{
return redirect()->guest('admin/login');
}
return $next($request);
}
}
}
laravel更改默認的登錄密碼加密方式
laravel 默認用的登錄密碼加密方式是:
$password = Hash::make('password');
而我平時用的密碼加密方式是:
$password = md5('password');
修改:
1.首先,打開這個文件夾:/vender/laravel/framework/src/illuminate/Auth
2.打開 EloquentUserProvider.php文件,將validateCredentials這個方法里的內容改成這樣的:
public function validateCredentials(UserInterface $user, array $credentials)
{
$plain = $credentials['password'];
$authPassword = $user->getAuthPassword();
return $authPassword === md5($plain);
}
這樣就ok了、可以使用laravel的驗證方法驗證,最后推薦使用laravel的HASh加密方式更加安全。MD5畢竟是可以破解的
修改laravel中默認Auth的password和name字段
如果想用username
代替name
,你可以重寫username()
方法在你的LoginController.php
中:
public function username(){
return 'username';
}
同樣的, 如果想用passwd
代替password
,可以寫一個存取器,在你的App\User.php
中
public function getAuthPassword(){
return $this->passwd;
}
在綁定用戶表的模型中,重寫
getAuthPassword()
方法,而在attempt
方法中照常使用password
就可以。Auth::guard('member')->attempt(['username'=>'13','password'=>'123456']);