[Day 30] 會員登入及登出(二)

會員登入及登出

今天繼續使用者登入的部分.

登入資料驗證

當接收到表單送來的資訊之後,
首先我們要針對資料作驗證.

app/Http/Controllers/UserAuthController.php新增signInProcess方法

//處理登入資料
public function signInProcess()
{
    //接收輸入資料
    $input = request()->all();

    //驗證規則
    $rules = [
        //帳號(E-mail)
        'account' => [
            'required',
            'max:50',
            'email',
        ],
        //密碼
        'password' => [
            'required',
            'min:5',
        ],
    ];

    //驗證資料
    $validator = Validator::make($input, $rules);

    if($validator->fails())
    {
        //資料驗證錯誤
        return redirect('/user/auth/sign-up')
            ->withErrors($validator)
            ->withInput();
    }
}

當輸入不符合規則的時候就會跳出錯誤訊息
 

https://ithelp.ithome.com.tw/upload/images/20201002/20105694ulJO5LgeJ8.png

從資料庫取得使用者資料

檢查過表單輸入的格式之後,
就要去資料庫檢查看看有沒有這個使用者,
找到使用者之後,
再檢查看看密碼是否正確.
如果密碼正確,
就能完成登入的動作,
當密碼有錯時,
就需要告知使用者輸入的密碼有誤.

我們將signInProcess方法修改如下

//處理登入資料
public function signInProcess()
{
    //前面省略

    //取得使用者資料
    $User = User::where('account', $input['account'])->first();

    if(!$User)
    {
        //帳號錯誤回傳錯誤訊息
        $error_message = [
            'msg' => [
                '帳號輸入錯誤',
            ],
        ];

        return redirect('/user/auth/sign-in')
            ->withErrors($error_message)
            ->withInput();
    }

    //檢查密碼是否正確
    $is_password_correct = Hash::check($input['password'], $User->password);

    if(!$is_password_correct)
    {
        //密碼錯誤回傳錯誤訊息
        $error_message = [
            'msg' => [
                '密碼輸入錯誤',
            ],
        ];

        return redirect('/user/auth/sign-in')
            ->withErrors($error_message)
            ->withInput();
    }
}

如果找不到使用者帳號,
就會顯示帳號輸入錯誤,
如果帳號正確但是密碼錯誤,
就會顯示密碼輸入錯誤.
 

https://ithelp.ithome.com.tw/upload/images/20201002/20105694mqoBRurkoK.png

取得Collection資料

我們使用ORM的方式,
取得的是Illuminate\Support\Collection;物件陣列或單一物件,
當使用first的時候,
如果從資料庫找不到資料就會回傳null,
當我們要取得$User底下的account欄位時,
我們可以用$User->account來取得,
其他欄位也是用同樣的方式,
能夠取得在繼承Model的物件中$fillable定義的所有欄位,
以及id、created_at和updated_at等欄位資料.

 

在這裡我們使用以下方法來驗證密碼

//檢查密碼是否正確
$is_password_correct = Hash::check($input['password'], $User->password);

因為密碼是經過加密,
而且這種加密方式每次結果可能會不同,
所以要透過特定的方法來做驗證,
當然Laravel已經幫我們寫好了,
我們只要使用Hash::check函式就能夠完成密碼驗證的動作了.