Laravel 中实现用户登录认证非常简单,因为Laravel基本上为你提供登录认证所需的一切组件,你只要拿过来用就可以了。在Laravel 5.1以前,新安装的Laravel内置了登录&注册功能,5.1中去除了该功能,但这仅仅是路由和视图,后台的一应代码还是保留了,所以我们要做的仅仅是自定义路由和视图即可。
那么,再开始之前,我们依然是先注册添加几个路由:
// 认证路由... Route::get('auth/login', 'Auth\AuthController@getLogin'); Route::post('auth/login', 'Auth\AuthController@postLogin'); // 注册路由... Route::get('auth/register', 'Auth\AuthController@getRegister'); Route::get('auth/register', 'Auth\AuthController@postRegister'); Route::get('auth/logout', 'Auth\AuthController@getLogout');
可以看到,展示了5个路由;依次是:
①、展示我们的登录表单;
②、负责去验证我们的登录;
③、展示我们的注册表单;
④、自然而然的就是去验证我们的注册信息;
⑤、最后一条,完善了我们的流程,负责登录和退出。
但是在最新版的 laravel框架中,登录认证又做了一些调整:
只需要在新安装的 Laravel 应用下运行 php artisan make:auth 和 php artisan migrate,这两个命令会生成用户登录注册所需要的所有东西,然后在浏览器中访问 http://your-app.dev/register 即可。具体操作如下:
首先,我们可以查看,app/Http/Controllers/Auth 文件夹下,Laravel 提供了几个预置的认证控制器,位于 App\Http\Controllers\Auth 命名空间下,分别是:
. |-ForgotPasswordController.php //用于处理重置密码邮件链接 |-LoginController.php //用于处理用户登录认证 |-RegisterController.php //用于处理新用户注册 |-ResetPasswordController.php //包含重置密码逻辑
每个控制器都使用 trait 来引入它们需要的方法。对很多应用而言,你根本不需要修改这些控制器:
路由:
Laravel 通过运行如下命令可快速生成认证所需要的路由和视图:
D:\software\wamp64\www\laravel5>php artisan make:auth
新安装的应用运行该命令会生成布局、注册和登录视图,以及所有的认证路由,同时生成 HomeController 用于处理应用的登录请求。
打开 routes/web.php 路由文件会发现新增了两行:
Auth::routes(); Route::get('/home', 'HomeController@index')->name('home');
登录注册相关路由都定义在上面 Auth::routes() 方法内。
视图:
正如上面所提到的,php artisan make:auth 命令会在 resources/views/auth 目录下创建所有认证需要的视图。make:auth 命令还创建了 resources/views/layouts 目录,该目录下包含了应用的基础布局文件。所有这些视图都使用了 Bootstrap CSS 框架,你也可以根据需要对其进行自定义。
认证:
现在你已经为自带的认证控制器设置好了路由和视图,接下来我们来实现新用户注册和登录认证。你可以在浏览器中访问定义好的路由,认证控制器默认已经包含了注册及登录逻辑(通过trait)。
我们先来注册一个新用户,在浏览器中访问 http://127.0.0.1:8000/register,即可进入注册页面:
填写表单点击「Register」按钮即可完成注册。注册成功后页面跳转到认证后的页面 http://127.0.0.1:8000/home:
要测试登录功能,可以先退出当前用户,然后访问登录页面 http://127.0.0.1:8000/login:
使用我们之前注册的信息登录成功后,同样会跳转到 http://127.0.0.1:8000/home。
自定义路径:
我们已经知道,当一个用户成功进行登录认证后,默认将会跳转到 /home,你可以通过在 LoginController, RegisterController 和 ResetPasswordController 中定义 redirectTo 属性来自定义登录认证成功之后的跳转路径:
protected $redirectTo = '/';
如果重定向路径需要自定义生成逻辑可以定义一个 redirectTo 方法来取代 redirectTo 属性:
protected function redirectTo() { return '/path'; }
注:redirectTo 方法优先级大于redirectTo 属性。
自定义用户名:
默认情况下,Laravel 使用 email 字段进行认证,如果你想要自定义认证字段,可以在 LoginController 中定义 username 方法:
public function username() { return 'username'; }
自定义Guard:
你还可以自定义用于实现用户注册登录的“guard”,要实现这一功能,需要在 LoginController,RegisterController 和 ResetPasswordController 中定义 guard 方法,该方法将会返回一个 guard 实例:
use Illuminate\Support\Facades\Auth; protected function guard() { return Auth::guard('guard-name'); }
需要注意的是,“guard”名称需要在配置文件 config/auth.php 中配置过:
自定义验证/存储:
要修改新用户注册所必需的表单字段,或者自定义新用户字段如何存储到数据库,你可以修改 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{ /** * 更新用户属性. * * @param Request $request * @return Response */ public function update(Request $request) { // $request->user() 返回认证用户实例... } }
上面两种方式返回的结果完全一致:
判断当前用户是否通过认证:
要判断某个用户是否登录到应用,可以使用 Auth 门面的 check 方法,如果用户通过认证则返回 true:
use Illuminate\Support\Facades\Auth; if (Auth::check()) { // The user is logged in... }
注:尽管我们可以使用 check 方法判断用户是否通过认证,但是我们通常的做法是在用户访问特定路由/控制器之前使用中间件来验证用户是否通过认证,想要了解更多,可以查看下面的路由保护。
退出:
要退出应用,可以使用 Auth 门面的 logout 方法,这将会清除用户 Session 中的认证信息:
Auth::logout();
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn