需要使用laravel搭建一個后臺內(nèi)容管理系統(tǒng)籽孙,但是laravel默認(rèn)的登陸注冊不能滿足目前的需求
登陸的話薛夜,首先需求是不一定需要郵箱進(jìn)行注冊,還可以直接使用用戶名等進(jìn)行登陸或者手機(jī)號
1. 登陸路由的確定
首先我們必須找到它默認(rèn)的登陸路由,這樣的話我們可以直接重寫它的登陸方法
默認(rèn)的登陸路由是直接在后面輸入\auth\login
,這個可以在手冊里找到舟扎,如果不是得話也可能是直接輸入login
然后它訪問的方法是Auth\AuthController@getLogin
和Auth\AuthController@postLogin
。
它們一個是顯示登陸頁面get請求悴务,一個是請求登陸使用的post請求
但是如果你查看這個controller的話睹限,就會發(fā)現(xiàn)找不到這個方法。這是因為它已經(jīng)在其它地方已經(jīng)實(shí)現(xiàn)了這個方法
目前的話讯檐,我們不需討論它是如何實(shí)現(xiàn)的羡疗,感興趣的可以查看下源碼。
2. 顯示登陸頁
這個使用的是getLogin
這個方法别洪,這個的話其實(shí)沒有什么要改的話叨恨,我們可以還直接使用它默認(rèn)的,不需要重寫
只需要找到它的視圖文件蕉拢,然后改它的視圖文件就好特碳。一般在resources\views\auth\login.blade.php
文件
3. 請求登陸
這個使用的是postLogin
這個方法诚亚,這個的話因為表名,字段名午乓,字段站宗,包括驗證等,都不符合我們的要求益愈,所以需要重寫
重寫的話可以使用兩種方法接收傳過來的數(shù)據(jù):
一種是使用request
的方法接收數(shù)據(jù)梢灭,另外一種是使用Input::get
的方法獲取數(shù)據(jù)。
Request的話需要引入use Illuminate\Http\Request
類
Input的話需要引入use Input
類
這里的話蒸其,推薦大家用request敏释,因為畢竟是PHP新特性。
另外使用Request類來接收的話摸袁,需要在參數(shù)里寫入 Request $request
4. 更改model
根據(jù)laravel的官方文檔介紹钥顽,驗證的話,其實(shí)使用的是App\User
類靠汁,如果你建立的用戶表或者字段跟model里的不一樣蜂大,就需要更改
(這里說明下,不更改也可以蝶怔,我們需要手動使用session
方法把用戶信息存入session里奶浦,更改User的好處是,可以使用laravel內(nèi)置的方法)
更改的方面主要是踢星,表名澳叉,主鍵,哪些字段可以賦值沐悦,已我的為例:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
protected $table = 'finance_enewsuser'; //定義用戶表名稱
protected $primaryKey = "userid"; //定義用戶表主鍵
public $timestamps = false; //是否有created_at和updated_at字段
protected $fillable = [ //可以被賦值的字段
'username','password','groupid','checked','styleid','filelevel','loginnum','lasttime','lastip','truename','email','pretime','preip'
];
protected $hidden = [ //在模型數(shù)組或 JSON 顯示中隱藏某些屬性
'password', 'remember_token',
];
}
根據(jù)自己的需求更改為和自己一樣的數(shù)據(jù)表名稱
5. 重寫方法和認(rèn)證用戶
重寫postLogin
的方法
認(rèn)證的話成洗,可以使用laravel提供的Auth::attempt(['email' => $email, 'password' => $password])
方法進(jìn)行認(rèn)證
注意把方法里的'email'和'password'兩個名稱改為和你數(shù)據(jù)庫里字段名稱相同的字段名稱(即,用戶名和密碼字段)
例:
Auth::attempt(['username' => $name, 'password' => $password])
上面所踊,我用戶數(shù)據(jù)表里的用戶名和密碼字段對應(yīng)于'username'和'password'字段
如果有人問泌枪,如果我用戶名不止一個字段概荷,該怎么辦秕岛,比如email和phone兩個字段都是用戶名,都可以登陸误证,這樣該怎么辦继薛?
其實(shí)我們可以使用兩次進(jìn)行認(rèn)證
例:
if (Auth::attempt(['email' => $name, 'password' => $password], 1)) {
return redirect()->intended('/');
} else if (Auth::attempt(['phone' => $name, 'password' => $password], 1)) {
return redirect()->intended('/');
}
其實(shí),完全不推薦這樣使用愈捅,可以在前面判斷好后在決定使用哪種認(rèn)證
6. 認(rèn)證失敗返回
上面的例子顯示的是成功的例子遏考,如果認(rèn)證失敗呢?比如用戶名不正確蓝谨,密碼不正確灌具,該怎么返回呢青团?
也是有兩種方法:
第一種是使用Validator
類,來進(jìn)行驗證輸入的數(shù)據(jù)和返回錯誤信息
另外一種是使用輔助函數(shù)來完成
這里因為是登陸咖楣,所以也沒有特別需要驗證的督笆,所以我們使用輔助函數(shù)來完成
例:
redirect('login')->withInput($request->except('password'))->with('msg', '用戶名或密碼錯誤');
redirect
表示重定向到哪個頁面
withInput
表示重定向后存儲的一次性數(shù)據(jù),這里我們把用戶輸入的數(shù)據(jù)還返回過去
except
方法表示返回除了指定鍵的所有集合項诱贿,這里我們把返回的數(shù)據(jù)里的密碼項給刪除
with
帶一次性session重定向的數(shù)據(jù)
7. 前端顯示錯誤信息
因為我們使用的是輔助函數(shù)來返回的錯誤娃肿,所以我們接收的話也使用輔助函數(shù)來接收數(shù)據(jù)
這里我們使用session
方法來接收這個錯誤
使用old('username')
接收上次輸出的數(shù)據(jù)
8. 完成后的示例
AuthController
public function postLogin(Request $request)
{
$name = $request->input('username');
$password = $request->input('password');
if( empty($remember)) { //remember表示是否記住密碼
$remember = 0;
} else {
$remember = $request->input('remember');
}
//如果要使用記住密碼的話,需要在數(shù)據(jù)表里有remember_token字段
if (Auth::attempt(['username' => $name, 'password' => $password], $remember)) {
return redirect()->intended('/');
}
return redirect('login')->withInput($request->except('password'))->with('msg', '用戶名或密碼錯誤');
}
login.blade
<form class="login-form" action="{{ url('/login') }}" method="post">
{!! csrf_field() !!}
<h3 class="form-title font-green">登陸</h3>
@if (session('msg'))
<div class="alert alert-danger display-hide" style="display: block;">
<button class="close" data-close="alert"></button>
<span>{{session('msg')}} </span>
</div>
@else
<div class="alert alert-danger display-hide">
<button class="close" data-close="alert"></button>
<span> 請輸入用戶名或密碼 </span>
</div>
@endif
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">Username</label>
<input class="form-control form-control-solid placeholder-no-fix" type="text" autocomplete="off" placeholder="Username" name="username" value="{{old('username')}}" /> </div>
<div class="form-group">
<label class="control-label visible-ie8 visible-ie9">Password</label>
<input class="form-control form-control-solid placeholder-no-fix" type="password" autocomplete="off" placeholder="Password" name="password" /> </div>
<div class="form-actions">
<button type="submit" class="btn green uppercase">登陸</button>
<label class="rememberme check">
<input type="checkbox" name="remember" value="1" />記住密碼 </label>
</div>
<div class="create-account">
</div>
</form>
如果Auth::attempt認(rèn)證用戶后珠十,然后在其它頁面使用
Auth::user()
獲取不到用戶信息的話料扰,很可能就是App\User
沒有配置正確
原文鏈接:Dennis`s blog