- 路由
Laravel 提供了一个简单的命令来快速生成身份验证所需的路由和视图:
php artisan make:auth
- 自定义用户名
Laravel 默认使用 email 字段来认证。如果你想用其他字段认证,可以在 LoginController 里面定义一个 username 方法:
public function username()
{
return 'username';
}
- 自定义看守器
你还可以自定义用于认证和注册用户的「看守器」。要实现这一功能,需要在 LoginController、RegisterController 和 ResetPasswordController 中定义 guard 方法。该方法需要返回一个看守器实例:
use Illuminate\Support\Facades\Auth;
protected function guard()
{
return Auth::guard('guard-name');
}
- 自定义验证/存储
要修改新用户在应用注册时所需的表单字段,或者自定义如何将新用户存储到数据库中,你可以修改 RegisterController 类。该类负责验证和创建应用的新用户。
RegisterController 的 validator 方法包含了应用验证新用户的规则,你可以按需要自定义该方法。
RegisterController 的 create 方法负责使用 Eloquent ORM 在数据库中创建新的 App\User 记录。你可以根据数据库的需要自定义该方法。
- 检索认证用户
use Illuminate\Support\Facades\Auth;
// 获取当前已认证的用户...
$user = Auth::user();
// 获取当前已认证的用户 ID...
$id = Auth::id();
或者,你还可以通过 Illuminate\Http\Request 实例来访问已认证的用户。请记住,类型提示的类会被自动注入到您的控制器方法中:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
/**
* 更新用户的简介。
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
// $request->user() 返回已认证的用户的实例...
}
}
- 确定当前用户是否认证
你可以使用 Auth facade 的 check 方法来检查用户是否登录,如果已经认证,将会返回 true:
use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
// 用户已登录...
}
- 保护路由
路由中间件 用于只允许通过认证的用户访问指定的路由。Laravel 自带了在 Illuminate\Auth\Middleware\Authenticate 中定义的 auth 中间件。由于这个中间件已经在 HTTP 内核中注册,所以只需要将中间件附加到路由定义中:
public function __construct()
{
$this->middleware('auth');
}
当然,如果使用 控制器,则可以在构造器中调用 middleware 方法来代替在路由中直接定义:
public function __construct()
{
$this->middleware('auth:api');
}
8.指定看守器
将 auth 中间件添加到路由时,还需要指定使用哪个看守器来认证用户。指定的看守器对应配置文件 auth.php 中 guards 数组的某个键:
public function __construct()
{
$this->middleware('auth:api');
}
- 登录限制
Laravel 内置的控制器 LoginController 已经包含了 Illuminate\Foundation\Auth\ThrottlesLogins trait。默认情况下,如果用户在进行几次尝试后仍不能提供正确的凭证,该用户将在一分钟内无法进行登录。这个限制基于用户的用户名/邮件地址和 IP 地址。 - 手动认证用户
当然,不一定要使用 Laravel 内置的认证控制器。如果选择删除这些控制器,你可以直接调用 Laravel 的认证类来管理用户认证。别担心,这简单得很。
我们可以通过 Auth facade 来访问 Laravel 的认证服务,因此需要确认类的顶部引入了 Auth facade。接下来让我们看一下 attempt 方法:
attempt 方法会接受一个键值对数组作为其第一个参数。这个数组的值将用来在数据库表中查找用户。所以在上面的例子中,用户将被 email 字段的值检索。如果用户被找到了,数据库中存储的散列密码将与通过数组传递给方法的散列 password 进行比较。 如果两个散列密码匹配,就会为用户启动一个已认证的会话
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
/**
* 处理身份认证尝试.
*
* @return Response
*/
public function authenticate()
{
if (Auth::attempt(['email' => $email, 'password' => $password])) { //如果认证成功,attempt 方法将返回 true,反之则返回 false。
// 认证通过...
return redirect()->intended('dashboard'); //
}
}
}
- 指定额外条件
除了用户的电子邮件和密码之外,你还可以向身份验证查询添加额外的条件。例如,我们可能会验证用户是否被标记为「活动」状态:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// 用户处于活动状态,不被暂停,并且存在。
}
- 注销用户
Auth::logout();
- 记住用户
如果你想要在应用中提供「记住我」的功能 , 则可以传递一个布尔值作为 attempt 方法的第二个参数,这会使在用户手动注销前一直保持已验证状态。当然,users 数据表必须包含 remember_token 字段,这是用来保存「记住我」的令牌
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
// 这个用户被记住了...
}
{tip} 如果你使用 Laravel 内置的 LoginController,则「记住」用户的逻辑已经由控制器使用的 traits 来实现。
如果你「记住」用户,可以使用 viaRemember 方法来检查这个用户是否使用「记住我」 cookie 进行认证:
if (Auth::viaRemember()) {
//
}
其它认证方法
- 验证用户实例
如果需要将现有用户实例记录到应用,可以使用用户实例调用 login 方法。给定的对象必须实现了 Illuminate\Contracts\Auth\Authenticatable 契约 。当然,Laravel 自带的 App\User 模型已经实现了这个接口:
Auth::login($user);
// 登录并且「记住」给定用户...
Auth::login($user, true);
当然,你也可以指定要使用的看守器实例:
Auth::guard('admin')->login($user);
- 通过 ID 验证用户
你可以使用 loginUsingId 方法通过其 ID 将用户记录到应用中。这个方法只接受要验证的用户的主键:
Auth::loginUsingId(1);
//登录并且「记住」给定的用户...
Auth::loginUsingId(1, true);
仅验证用户一次
你可以使用 once 方法将用户记录到单个请求的应用中。不会使用任何会话或 cookies, 这个对于构建无状态的 API 非常的有用:
if (Auth::once($credentials)) {
//
}