Laravel 用户认证
2016-02-14 23:04
633 查看
看到本文标题的时候,可能有不少读者会表示不屑,因为这个都是官方文档以及网上许多教程说明过无数次的东西。但如果你有耐心继续读完的话,会发现我写的并不完全是官方文档所教的那些。
诚然,Laravel 被标榜为一个优雅的 PHP 框架,它有着十分高质的代码以及活跃的社区,同时他的文档也比较完备和规范。这里使用“比较”这个词的原因是,个人觉得官方文档需要对每个基本的方面都有说明,但一些部分并不详细,可能代码维护者对这套框架的受众(也就是我们)有着充分的信心,认为我们都有能力并有兴趣去探索官方文档没有细说的一些东西,就如代码里一些注释里所写的那样——Why don't you explore it?
进入本文正题,Laravel 有着强大的用户认证模块,通过合理的配置和几项简单的操作之后,即可实现用户登录、注册、重置密码等功能。而不需要我们写太多代码。具体的步骤官方文档里已经有了比较详细的说明了。但问题是,根据官方文档步骤操作之后得到的是默认的 Auth 控制器、中间件以及视图,而且使用Auth::route() 方法生成的路由也是指向这些默认操作的。这对于一般的简单应用确实是事半功倍,省却了不少麻烦,不过如果是比较大型的项目,同时涉及多个模块的认证操作,那就并不适用了。
比如在我自己的一个项目里,同时有手机端、PC端用户中心以及系统管理后台几个模块需要用到认证,这种情况下再按官方文档里的来显然是不大够用的。我需要为不同的模块使用不同的登录逻辑,中间件以及模板。这时候就需要自己动手了。
首先,就是添加路由分组,并为不同分组设置相应的中间件。至于中间件的写法,可以参考默认的Authenticate中间件,例如我的PC端用户中心的中间件代码如下:
这里有两点儿需要注意的就是,一是定义 $except 属性,包含需要过滤的几个 url,同时自己实现过滤的相关逻辑,这个可以参考 CSRF 中间件部分代码,即上面的shouldPassThrough相关代码。二是 return redirect()->guest('user/login') 中当未通过中间件时重定向的地址应该指向对应模块的登录地址。
然后仿造默认的 AuthController 编写对应模块的认证控制器。对于控制器中有几点需要说明的就是,因为我们需要对不同的需要使用不同的模板,登录之后也需要跳转到不同的页面,因此有如下几个属性需要我们自己定义,不然的话,出现的登录页面就是系统默认的那个了。
完成这些之后,再添加对应的视图文件,相关表单的字段名参考默认的认证视图文件就好了,当然可以根据自己的情况作些调整,例如添加额外的注册字段(对应的数据表、模型以及控制器需要调整),改变登录字段名为 email 或者 name。
一切准备就绪后,访问指定的路由,即会显示出登录、注册相关的页面了。最后放出我的登录页面。不同的模块可以使用不同的认证视图和控制器了。
诚然,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。
一切准备就绪后,访问指定的路由,即会显示出登录、注册相关的页面了。最后放出我的登录页面。不同的模块可以使用不同的认证视图和控制器了。
相关文章推荐
- Mac OSX下安装php5.3之上的ZendOptimizer-即Guard Loader
- Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面
- Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面
- Atitit.跨语言 java c#.net php js常用的codec encode算法api 兼容性 应该内置到语言里面
- PHP验证登录用户名和密码
- mysql 通过Workbench/phpMyAdmin连接MySQL
- ThinkPHP - 扩展个人类库 - 以验证码类为例子
- PHP关于上传图片的知识点
- PHP:数组操作函数array_walk()和array_map()
- php开发环境
- PHP代码段
- PHP中htmlentities和htmlspecialchars的区别
- PHP如何读取xml文件?
- php解析html类库simple_html_dom
- php+mongo下的注入学习
- PHP验证登录用户名和密码
- ThinkPHP3.12使用PHPMailer发送邮件
- php实现按指定大小等比缩放生成上传图片缩略图的方法
- 在Mac OS上搭建PHP的Yii框架及相关测试环境
- PHP获取POST数据的三种方法