1. 程式人生 > >php-laravel框架使用者驗證(Auth)模組解析(三)登入模組

php-laravel框架使用者驗證(Auth)模組解析(三)登入模組

一、登入模組路由

路由名稱 請求方式 方法實現
/login GET 登入頁面
/login POST 實現登入功能
/logout POST 實現登出功能

二、控制器解析

跟註冊的控制器一樣,大部分的邏輯使用trait引入。

$redirectTo配置,如果在登入狀態,重定向的頁面

protected $redirectTo = '/home';

非常簡單一個控制器。

三、登入狀態判斷

登入狀態判斷與使用,使用Auth facade 來判斷

// 獲取當前通過認證的使用者
$user = Auth::user(); 

// 獲取當前通過認證的使用者 ID
$id = Auth::id();

//判斷是否已登入
Auth::check();

在blade模板中,可以使用@guest標籤來處理

@guest
  未登入
@else
  已登入,使用者名稱:{{ Auth::user()->name }}                    
@endguest

四、擴充套件開發:自定義的登入行為

預設生成的程式碼,使用email進行登入,這裡我們嘗試修改為可使用使用者名稱、電子郵箱、手機號這三種方式之一來登入。

1)在auth/login.blade.php模板中,把email欄位修改為login_name(當然,這個欄位是自定義的)

2)修改登入的行為

登入行為位於Illuminate\Foundation\Auth\AuthenticatesUsers::login方法中

$this->validateLogin($request); 

驗證登入引數,由於我們改了欄位,需要重寫這個方法,並修改sendFailedLoginResponse的提示資訊。

    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            'login_name' => 'required|string',
            'password' => 'required|string',
        ]);
    }

    protected function sendFailedLoginResponse(Request $request)
    {
        throw ValidationException::withMessages([
            'login_name' => [trans('auth.failed')],
        ]);
    }

$this->attemptLogin($request);

實現登入邏輯,需要迴圈3個欄位查詢。$this->guard()->attempt實現了從資料庫中獲取User例項。

    protected function attemptLogin(Request $request)
    {
        foreach (['name', 'email', 'phone'] as $loginName) {
            $requestArr = [
                $loginName => $request->input('login_name'),
                'password' => $request->input('password'),
            ];
            $loginStatus = $this->guard()->attempt(
                $requestArr, $request->filled('remember')
            );
            if ($loginStatus) {
                return $loginStatus;
            }
        }
        return false;
    }

Ok,我們自定義的登入行為就完成了,可以看看我的demo:http://shebao.bytrees.com/login​​​​​​​