快速入门
Laravel 提供了几个预置的认证控制器,位于 App\Http\Controllers\Auth 命名空间下。
RegisterController 用于处理新用户注册, LoginController 用于处理用户登录认证, ForgotPasswordController 用于处理重置密码邮件链接, ResetPasswordController 包含重置密码逻辑,每个控制器都使用 trait 来引入它们需要的方法。对很多应用而言,你根本不需要修改这些控制器。
迁移数据表
执行如下命令:
php artisan migrate
它会根据 database/migrations 中的文件,迁移生成登录注册相关的数据表(默认包含 users、password_resets)。
创建路由和视图
通过运行如下命令可快速生成认证所需要的路由和视图:
php artisan make:auth
新安装的 Laravel 运行该命令会生成布局、注册和登录视图,以及所有的认证路由,同时生成 HomeController 用于处理应用的登录请求。
打开 routes/web.php 路由文件会发现新增了两行:
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
登录注册相关路由都定义在了上面 Auth::routes() 方法内。
现在你已经为自带的认证控制器设置好了路由和视图,接下来我们来实现新用户注册和登录认证。你可以在浏览器中访问定义好的路由,认证控制器默认已经包含了注册及登录逻辑(通过trait)。
注册一个新用户
在浏览器中访问 http://www.adm.devp/register ,即可进入注册页面。
注册成功后页面跳转到认证后的页面 http://www.adm.devp/home 。
退出当前的用户后,访问登录页面 http://www.adm.devp/login ,测试登录。
自定义跳转路径
当一个用户成功进行登录认证后,默认将会跳转到 /home。
你可以通过在 LoginController 中,定义 redirectTo 属性来自定义登录认证成功之后的跳转路径:
protected $redirectTo = '/home';
如果重定向路径需要自定义生成逻辑可以定义一个 redirectTo() 方法来取代 redirectTo 属性:
protected function redirectTo()
{
return '/path';
}
注:redirectTo() 方法的优先级大于redirectTo 属性。
自定义验证/存储
要想修改新用户注册所必需的表单字段,或者自定义新用户字段如何存储到数据库,你可以修改 RegisterController 类。该类负责为应用验证输入参数和创建新用户。
RegisterController 的 validator 方法包含了新用户注册的验证规则,你可以按需要自定义该方法。
RegisterController 的 create 方法负责使用 Eloquent ORM 在数据库中创建新的 App\User 记录。你也可以自定义该方法。
获取登录用户信息
可以通过 Auth 门面访问认证用户:
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
{
//
public function update(Request $request)
{
$user = $request->user(); // 返回认证用户实例
dump($user);
}
}
判断当前用户是否通过认证
要判断某个用户是否登录到应用,可以使用 Auth 门面的 check 方法,如果用户通过认证则返回 true:
use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
// The user is logged in...
}
注:尽管我们可以使用 check 方法判断用户是否通过认证,但是我们通常的做法是在用户访问特定路由/控制器之前使用中间件来验证用户是否通过认证,想要了解更多,可以查看下面的路由保护。
路由保护
路由中间件可用于只允许通过认证的用户访问给定路由。
Laravel 通过定义在 Illuminate\Auth\Middleware\Authenticate 中的 auth 中间件来实现这一功能。由于该中间件已经在 HTTP kernel 中注册,你所要做的仅仅是将该中间件加到相应的路由定义中:
Route::get('profile', function() {
// 只有认证用户可以进入...
})->middleware('auth');
你也可以在控制器的构造方法中调用 middleware 方法来实现同样的功能。
例如,HomeController 就是这么做的:
public function __construct()
{
$this->middleware('auth');
}
因此,在没有登录的情况下,访问 http://www.adm.devp/home 会跳转到登录页面。
指定一个Guard
添加 auth 中间件到路由后,还可以指定使用哪个 guard 来实现认证, 指定的 guard 对应配置文件 config/auth.php 中 guards 数组的某个键。
如果没有指定的话,默认 guard 是 web,这也是 config/auth.php 配置文件中默认配置的。
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],