用户认证
最后更新于:2022-04-01 15:05:41
Laravel 已经预设了两个认证相关的控制器。 `AuthController `处理新的用户注册和「登陆」,而 `PasswordController` 可以帮助已经注册的用户重置密码。
每个控制器使用 `trait` 引入需要的方法。在大多数应用上,你不需要修改这些控制器。这些控制器用到的视图放在 `resources/views/auth` 目录下。你可以依照需求修改這些视图。
## 用户注册
要修改应用注册新用户时所用到的表单字段,可以修改 App\Services\Registrar 类。这个类负责验证和建立应用的新用户。
Registrar 的 `validator` 方法包含新用户时的验证规则,而 Registrar 的 `create` 方法负责在数据库中建立一条新的 User 记录。你可以自由的修改这些方法。`Registrar` 方法是通过`AuthenticatesAndRegistersUsers trait` 的中的 `AuthController` 调用的。
### 手动认证
如果你不想使用预设的 `AuthController`,你需要直接使用 Laravel 的身份验证类来管理用户认证。别担心,这也很简单的!首先,让我们看看 attempt 方法:
~~~
<?php namespace App\Http\Controllers;
use Auth;
use Illuminate\Routing\Controller;
class AuthController extends Controller {
/**
* Handle an authentication attempt.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password]))
{
return redirect()->intended('dashboard');
}
}
}
~~~
attempt 方法可以接受由键值对组成的数组作为第一个参数。password 的值会先进行 哈希。数组中的其他 值会被用来查询数据表里的用户。所以,在上面的示例中,会根据 email 列的值找出用户。如果找到该用户,会比对数据库中存储的哈希过的密码以及数组中的哈希过后的 password值。假设两个哈希后的密码相同,会重新为用户启动认证通过的 session。
如果认证成功, `attempt` 将会返回 `true`。否则则返回 `false`。
> 注意:在上面的示例中,并不一定要使用 email 字段,这只是作为示例。你应该使用对应到数据表中的「username」的任何键值。
`intended` 方法会重定向到用户尝试要访问的 URL , 其值会在进行认证过滤前被存起来。也可以给这个方法传入一个预设的 URI,防止重定向的网址无法使用。
### 以特定条件验证用户
在认证过程中,你可能会想要加入额外的认证条件:
~~~
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
{
// The user is active, not suspended, and exists.
}
~~~
### 判断用户是否已验证
判断一个用户是否已经登录,你可以使用 check 方法:
~~~
if (Auth::check())
{
// The user is logged in...
}
~~~
### 认证用户并且「记住」他
假如你想要在应用中提供「记住我」的功能,你可以传入布尔值作为 `attempt` 方法的第二个参数,这样就可以保留用户的认证身份(或直到他手动登出为止)。当然,你的 `users` 数据表必需包括一个字符串类型的 `remember_token` 列來储存「记住我」的标识。
~~~
if (Auth::attempt(['email' => $email, 'password' => $password], $remember))
{
// The user is being remembered...
}
~~~
假如有使用「记住我」功能,可以使用 viaRemember 方法判定用户是否拥有「记住我」的 cookie 來判定用户认证:
~~~
if (Auth::viaRemember())
{
//
}
~~~
### 以 ID 认证用户
要通过 ID 来认证用户,使用 `loginUsingId` 方法:
~~~
Auth::loginUsingId(1);
~~~
## 验证用户信息而不登陆
`validate` 方法可以让你验证用户凭证信息而不用真的登陆应用:
~~~
if (Auth::validate($credentials))
{
//
}
~~~
### 在单一请求内登陆用户
你也可以使用 `once` 方法來让用户在单一请求内登陆。不会有任何 `session` 或 `cookie` 产生:
~~~
if (Auth::once($credentials))
{
//
}
~~~
### 手动登陆用户
假如你需要将一个已经存在的用户实例登陆应用,你可以调用 `login` 方法并且传入用户实例:
`Auth::login($user);`
这个方式和使用 `attempt` 方法验证用户凭证信息是一样的。
用户登出
`Auth::logout();`
当然,假设你使用 Laravel 內建的认证控制器,预设提供了让用户登出的方法。
### 认证事件
当 `attempt` 方法被调用时,`auth.attempt` 事件 会被触发。假设用户尝试认证成功并且登陆了,`auth.login` 事件会被触发。