【laravel】用户认证之----手动认证用户

模型

若是某个模型类须要用于认证,必须继承自 Illuminate\Foundation\Auth\User 基类,不然会报错。而后在这个模型类中使用 Notifiable Trait,里面提供了用户发送通知的相关方法。配置 $hidden 属性,在返回查询结果的时候将敏感信息过滤掉,避免安全隐患。
php

<?php namespace App\Models; use Illuminate\Foundation\Auth\User; use Illuminate\Notifications\Notifiable; class Manager extends User { use Notifiable; protected $hidden = ['password', 'remember_token']; }

手动认证:attempt

public function login(Request $request) { $rs = \Auth::guard('admin')->attempt($request->only(['email', 'password'])); if ($rs) { return redirect()->intended('dashboard'); } }

attempt 方法接受一个键值对数组做为其第一个参数。数组中的值将被用于在数据表中查找用户。因此,在上例中,用户将经过 email 字段的值进行检索。若是找到了这个用户,数据库中保存的哈希密码将被用来与传递给方法的数组中 password 的哈希值进行比较。你不该该将指定为密码的 password 的值进行哈希操做,由于框架将在比较前,自动对其进行hash操做。若是这两个哈希密码匹配,就会为用户开启一个已认证的会话。html

若是认证成功那么 attempt 方法将返回 true。反之,会返回 false 。laravel

重定向器上的 intended 方法将重定向用户到他们曾经但愿访问的 URL,这个 URL 以前被用户认证中间件拦截了。能够给这个方法传递一个回退 URI,用于预期的地址不可用的状况。web

记住用户

若是想在应用中提供「记住我」的功能 ,你能够给 attempt 方法的第二个参数传入一个布尔值,这将永久保持用户的认证状态,或者直到他们手动注销登陆。固然,你的用户表必须包含名为 remember_token 的字符串字段,它将被用于保存「记住我」的令牌。数据库

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) { // 这个用户被记住了...
}

若是你启用了「记住」用户,你可使用 viaRemember 方法肯定用户是否正使用「记住我」的cookie令牌进行的认证 数组

if (Auth::viaRemember()) { // }

注销登陆

要将用户从应用中注销,你可使用 Auth 门面上的 logout 方法。这将清除用户会话中的认证信息:安全

Auth::logout();

其它认证方式

经过用户实例登入应用

若是你须要把现存的用户实例登入应用, 你能够调用 login 方法并附带用户实例做为参数。给定的这个对象必须实现 Illuminate\Contracts\Auth\Authenticatable 契约,或者继承自Illuminate\Foundation\Auth\User基类。cookie

Auth::login($user); // 登陆而且「记住」给定的用户...
Auth::login($user, true);

经过 ID 验证用户

要使用用户的 ID 登陆应用,你可使用 loginUsingId 方法。这个方法接受须要认证的用户主键:app

Auth::loginUsingId(1); // 登陆而且「记住」给定的用户...
Auth::loginUsingId(1, true);

仅验证用户一次

你能够在单次请求中使用 once 方法将用户登陆到应用中。这将不会使用任何 Session 或者 Cookie,这意味着在构建无状态API时,此方法可能会有所帮助:框架

if (Auth::once($credentials)) { // }

让其它设备上的 Session 失效

Laravel 还提供了一种机制,用于将其它设备上的用户 Session 失效和「注销」,而不会使其当前设备上的 Session 失效。首先,你须要保证Illuminate\Session\Middleware\AuthenticateSession 中间件在你的app/Http/Kernel.php类中的 web 中间件组中,而且没有被注释掉:

'web' => [ // ...
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    // ...
],

而后, 你就可使用 Auth 门面上的 logoutOtherDevices 方法。此方法要求用户提供其当前密码,你的应用程序应经过输入表单接受该密码:

use Illuminate\Support\Facades\Auth; Auth::logoutOtherDevices($password);

 参考文档

官方文档:https://learnku.com/docs/laravel/5.7/authentication/2269#08b509

laravel学院:https://laravelacademy.org/post/9733.html

相关文章
相关标签/搜索