【laravel】用户认证之----手动认证用户
模型
如果某个模型类需要用于认证,必须继承自 Illuminate\Foundation\Auth\User
基类,否则会报错。然后在这个模型类中使用 Notifiable
Trait,里面提供了用户发送通知的相关方法。配置 $hidden
属性,在返回查询结果的时候将敏感信息过滤掉,避免安全隐患。
<?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操作。如果这两个哈希密码匹配,就会为用户开启一个已认证的会话。
如果认证成功那么 attempt
方法将返回 true
。反之,会返回 false
。
重定向器上的 intended
方法将重定向用户到他们曾经希望访问的 URL,这个 URL 之前被用户认证中间件拦截了。可以给这个方法传递一个回退 URI,用于预期的地址不可用的情况。
记住用户
如果想在应用中提供「记住我」的功能 ,你可以给 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基类。
Auth::login($user); // 登录并且「记住」给定的用户... Auth::login($user, true);
通过 ID 验证用户
要使用用户的 ID 登录应用,你可以使用 loginUsingId
方法。这个方法接受需要认证的用户主键:
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
=======================================
由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论哦。你也可以关注我,一起学习哦!