您的位置:首页 > 编程语言 > PHP开发

Laravel 用户认证

2016-02-14 23:04 633 查看
看到本文标题的时候,可能有不少读者会表示不屑,因为这个都是官方文档以及网上许多教程说明过无数次的东西。但如果你有耐心继续读完的话,会发现我写的并不完全是官方文档所教的那些。

诚然,Laravel 被标榜为一个优雅的 PHP 框架,它有着十分高质的代码以及活跃的社区,同时他的文档也比较完备和规范。这里使用“比较”这个词的原因是,个人觉得官方文档需要对每个基本的方面都有说明,但一些部分并不详细,可能代码维护者对这套框架的受众(也就是我们)有着充分的信心,认为我们都有能力并有兴趣去探索官方文档没有细说的一些东西,就如代码里一些注释里所写的那样——Why don't you explore it?


进入本文正题,Laravel 有着强大的用户认证模块,通过合理的配置和几项简单的操作之后,即可实现用户登录、注册、重置密码等功能。而不需要我们写太多代码。具体的步骤官方文档里已经有了比较详细的说明了。但问题是,根据官方文档步骤操作之后得到的是默认的 Auth 控制器、中间件以及视图,而且使用Auth::route() 方法生成的路由也是指向这些默认操作的。这对于一般的简单应用确实是事半功倍,省却了不少麻烦,不过如果是比较大型的项目,同时涉及多个模块的认证操作,那就并不适用了。

比如在我自己的一个项目里,同时有手机端、PC端用户中心以及系统管理后台几个模块需要用到认证,这种情况下再按官方文档里的来显然是不大够用的。我需要为不同的模块使用不同的登录逻辑,中间件以及模板。这时候就需要自己动手了。

首先,就是添加路由分组,并为不同分组设置相应的中间件。至于中间件的写法,可以参考默认的Authenticate中间件,例如我的PC端用户中心的中间件代码如下:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class UserAuthenticate
{
/**
* @var array
*/
protected $except = [
'user/register',
'user/password',
'user/login',
'user/lock',
];

/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @param  string|null  $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($this->shouldPassThrough($request)) {
return $next($request);
}

if (Auth::guard($guard)->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('user/login');
}
}

return $next($request);
}

/**
* Determine if the request has a URI that should pass through CSRF verification.
*
* @param  \Illuminate\Http\Request  $request
* @return bool
*/
protected function shouldPassThrough($request)
{
foreach ($this->except as $except) {
if ($except !== '/') {
$except = trim($except, '/');
}

if ($request->is($except)) {
return true;
}
}

return false;
}
}


这里有两点儿需要注意的就是,一是定义 $except 属性,包含需要过滤的几个 url,同时自己实现过滤的相关逻辑,这个可以参考 CSRF 中间件部分代码,即上面的shouldPassThrough相关代码。二是 return redirect()->guest('user/login') 中当未通过中间件时重定向的地址应该指向对应模块的登录地址。

然后仿造默认的 AuthController 编写对应模块的认证控制器。对于控制器中有几点需要说明的就是,因为我们需要对不同的需要使用不同的模板,登录之后也需要跳转到不同的页面,因此有如下几个属性需要我们自己定义,不然的话,出现的登录页面就是系统默认的那个了。
/**
* Where to redirect users after login / registration.
*
* @var string
*/
protected $redirectTo = '/user';

/**
* Where to redirect users after logout.
*
* @var string
*/
protected $redirectAfterLogout = '/';

/**
* Login view.
*
* @var string
*/
protected $loginView = 'user.auth.login';

/**
* Logout view.
*
* @var string
*/
protected $registerView = 'user.auth.register';

/**
* Login via username.
*
* @var string
*/
protected $username = 'name';
这些属性,注释中说明的已经比较清楚了,分别是登录成功之后的跳转地址、退出登录之后的跳转地址、登录视图、注册视图以及通过哪个字段登录,对于最后一个 $username 系统默认是通过 email 登录,而我我项目中使用的是用户名登录,所以如上图设置。

完成这些之后,再添加对应的视图文件,相关表单的字段名参考默认的认证视图文件就好了,当然可以根据自己的情况作些调整,例如添加额外的注册字段(对应的数据表、模型以及控制器需要调整),改变登录字段名为 email 或者 name。

一切准备就绪后,访问指定的路由,即会显示出登录、注册相关的页面了。最后放出我的登录页面。不同的模块可以使用不同的认证视图和控制器了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: