Laravel 用户认证

来源:互联网 发布:es5 sham.js 编辑:程序博客网 时间:2024/06/05 07:07

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

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

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

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

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

<?phpnamespace 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。

一切准备就绪后,访问指定的路由,即会显示出登录、注册相关的页面了。最后放出我的登录页面。不同的模块可以使用不同的认证视图和控制器了。


0 0
原创粉丝点击