Laravel开发记录(三):用户认证登录与退出
前面对laravel的整体运行机制和MVC架构有了初步的了解,接下来我们进入其中一个重要的模块,用户认证,这个模块是laravel的一个重要的模块,现在做什么网站不需要登录呢?所以在这个部分,我折腾了两天各种啃文档,但是文档写的虽然简单,但是并不全面,对于小白来说很多坑得自己踩过才知道,所以前半段我会记录我啃文档的心得,后半部分为实际操作,结合来看应该能理解更深。
一、烦躁的概念我们简单说
用户登录认证我们首先要知道laravel为我们做了什么,其实大多数框架也是这些逻辑,只是各种方法的实现不一样,其实在我看来就是相关方法放的位置不一样。
1、文档中说laravel的认证模块的配置在/config下的auth.php,的确laravel把最常用的设置都配置好了,这个文档基本不需要什么变更,当然如果你需要更改其中一些特殊配置,自行百度吧,我们先把基本功能实现。
2、在底层代码中,Laravel 的认证组件由「guards」和「providers」组成,Guard 定义了用户在每个请求中如何实现认证,例如,Laravel 通过 session guard 来维护 Session 存储的状态和 Cookie。Provider 定义了如何从持久化存储中获取用户信息,Laravel 底层支持通过 Eloquent 和数据库查询构建器两种方式来获取用户,如果需要的话,你还可以定义额外的 Provider。
这是文档原话,听起来很难懂,但是我的理解就是guard就是个门卫,post过去的登录数据以何种方式认证存储,在配置文件中/config/auth.php中配置,默认提供了web和api两个看门的保安,如果你有需要也可以依葫芦画瓢再弄一个,但我觉得完全没必要,web的已经够用了。
providers则可以理解为给你办门禁卡的或者就是那个门禁卡刷卡机,用来保持登录之类的用的,我理解的可能不够全面,但是我尽量用小白的方式描述。总之,在 Laravel 的底层实现中,通过 Provider 存取数据,通过 Guard 存储用户认证信息,前者主要和数据库打交道,后者主要和 Session 打交道(API 例外)。再总之,一般这两都不怎么需要更改。
动手吧!我已迫不及待!
1、数据准备
用户认证需要用到用户表,你可以使用数据库同步命令,先生成一个看看,看看有哪些字段,数据库生成工具我觉得不是很好用,我这里列一下我试出来的必须的users表的字段:
字段名 | 存储类型 |
---|---|
id | bigint(20) |
username | varchar(255) |
password | varchar(255) |
remember_token | varchar(100) |
created_at | timestamp |
updated_at | timestamp |
以上这些是我发现的必须要的字段,如果你用数据库同步的方式生成user表会多email相关的东西,但是我给去了,因为laravel默认使用email登录,但是我的系统不需要email,所以我就给去了,顺便提一下数据同步的方式,laravel在安装的时候就会生成user表的同步文件,位置在/database/migration下,你可以看到三个表格,这些就是默认必须的三个表,你可以在其中增加自己想要的字段后,执行命令:
php artisan migrate
数据库里就自动生成这三个表了。
2、前端准备
文档中说要使用:
composer require laravel/ui --dev
php artisan ui vue --auth
生成前端的脚手架,其实我是觉得没必要,执行完以后无非在view下生成了一堆登录验证的视图文件而已,然后加了两路由,反而对之后自己的模板造成干扰。
3、认证相关控制器
其实laravel的控制器目录里已经有了预制的控制器,就在/app/Http/controller/auth下,这里面你看文件名也都能知道他们是干啥的。
RegisterController 用于处理新用户注册, LoginController 用于处理用户登录认证, ForgotPasswordController 用于处理重置密码邮件链接, ResetPasswordController 包含重置密码逻辑,每个控制器都使用 trait 来引入它们需要的方法。
文档中说对很多应用而言你根本不需要动这些东西,现实却是实际上真的就是动这些东西。
其中登录有两个步骤:1、提交用户名密码认证,2认证成功跳转到哪不成功怎么办
先说第一个,提交用户认证的步骤,前面我们说过laravel是默认用email作为认证参数的,那我要改成用户名密码认证怎么办?
在/app/Http/controller/auth/LoginController.php中加入:
public function username()
{
return 'username';
}
ok了,为啥,网上找我们会发现有这么一句话use AuthenticatesUsers;
这个AuthenticatesUsers又在哪呢?再往上:use Illuminate\Foundation\Auth\AuthenticatesUsers;
这个类就在**/vendor/laravel/framework/src/Illuminate/Foundation/Auth/**下,我们打开来看就会发现,文档中的方法就是重写了这个方法,其实这个controller的更改也都是这样实现的。
接下来我们看第二个问题,更改跳转的位置:
protected $redirectTo = RouteServiceProvider::HOME;
把这句里的参数换成你想让他去的地方把,就ok了
我做了两个跳转,根据用户的权限跳转进不同的后台,我这么做虽然不够高端但是简单,也更好看清原理。
在LoginController中加入:
protected function redirectTo()
{
//users表中我自己加入的auth字段用于区分权限
if (Auth::user()->auth==1){
return '/admin/index';
}elseif(Auth::user()->auth==0){
return '/customer/index';
}
}
这样就实现了登录控制器根据用户权限的跳转,这里用到了Auth这个门面,需要在文件头引入
use Illuminate\Support\Facades\Auth;
现在剩最后一个问题了登录错了或者未登录用户直接输入地址自动重定向到哪呢?
我们发现这里几乎每一个控制器里都有一个protected $redirectTo,这东西就是指这项操作完成后来跳到哪去,那么未经登录的访客他们访问需要登录的页面去哪呢?在这:
/app/Http/Middleware/Authenticate.php
在其中修改
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('home');//修改这里的参数,他就会去他该区的地方
}
}
这里有坑!
好的,自此文档内容结合我的实践就在这里,你们一定会问,坑呢?折磨我一天的居然是。。。登录后的cookie,这么说吧,我之前代码什么的都没问题,就是跳转那老报错或者不成功,后来我偶然的在一次出错后清了浏览器缓存,居然就好了,再试第二遍又不行,原来是缓存闹得,所以在你写好注销的登录方法之前测试代码的时候记得清缓存,顺便说下退出登录代码很简单:
在特定的控制器中加入:
public function logout(){
Auth::logout();
return redirect('home');
}
在前台页面相应按钮处添加链接{{url('/admin/logout')}}
在路由文件中admin模块加入Route::get('logout','IndexController@logout');
就OK了
控制器设置只能登录后访问否则跳转有两种方式,我推荐这种在相应控制器中添加构造方法附加中间件的方式:
public function __construct()
{
$this->middleware('auth');
}
今天就写这么多吧,明天我们来玩表单!