作者:Adlerian
1. Session机制
由于HTTP是无状态协议,上一个请求与下一个请求无任何关联,这就导致如果后面的请求需要使用前面请求所产生的数据,就必须重新传递。所以,在开发用户登录功能时,必须借助一种技术来记住用户的登录状态,这个技术就是Session机制。使用Session机制可以跟踪用户在网站中的操作。
1.1 Session的配置
Laravel 通过简洁的API 统一处理后端各种Session 驱动。Session 配置文件是config\session.php,在该配置文件中,可以设置使用什么驱动保存Session、Session 的有效期和Cookie相关的配置项。
Laravel支持的Session驱动:
- File:将Session数据存储在storage\framework\sessions目录下。
- Cookie:将Session数据存储在经过安全加密的Cookie中。
- Database:将Session数据存储在数据库中。
- Memcached/Redis:将Session数据存储在Memcached或Redis服务器中。
- array:将Session数据存储在PHP的数组中,是非持久化的存储方式。
注:Database作为Session驱动时,需要在数据库中创建数据表,表中需要有Session字段。数组驱动通常用于测试,避免测试的Session数据持久化存储。Memcached或者Redis驱动通常用于生产环境。
1.2 Session的基本使用
Laravel 框架没有使用PHP 内置的Session 功能,而是采用了一套更加灵活强大的Session 机制,因此在Laravel 中通过$_SESSION 方式无法获取Session 的值。在Laravel中主要通过两种方式来操作Session数据,一种方式是通过 Request实例,另一种方式是利用全局辅助函数session()来实现。
Session文件默认保存在storage\framework\sessions目录下,该目录下的文件名都是自动生成的。
在控制器中添加testsession()
方法
public function testSession()
{
session(['name' => '张三', 'age' => 25]);
dump(session('name'));
}
在web.php
中配置路由规则
Route::get('test/testSession','TestController@testSession');
访问路由
其他操作
session(['name' => '张三']); // 写入Session
dump(session('name')); // 输出结果:张三
dump(session('age', 0)); // 当读取Session不存在时,返回默认值0
dump(session()->all()); // 获取所有Session
dump(session()->forget('name')); // 删除名称为name的Session
dump(session()->has('name')); // 判断Session是否存在
session()->flush(); // 删除全部Session
2. 中间件
中间件的主要功能是过滤进入应用的HTTP请求。例如,利用中间件来验证用户是否已经登录,如果用户没有登录,中间件会将用户重定向到登录页面,而如果用户已经登录,中间件就会允许请求继续进入下一步操作。
2.1 定义中间件
中间件和控制器类似,都可以通过命令来快速创建,定义中间件的命令:
php artisan make:middleware Test
- make:middleware 表示生成中间件
- Test是中间件的名称
上述命令执行成功后,会在 app\Http\Middleware 目录下创建一个新的中间件类 Test.php
除了自定义中间件外,Laravel框架内置了一些用于处理其他任务的中间件。
2.2 注册中间件
中间件定义完成后,直接访问还不能生效,要想使这个中间件生效,需要将其注册到指定路由。
中间件分为3类,分别是全局中间件、中间件组和指定路由中间件。
2.2.1 全局中间件
全局中间件是指在每次HTTP请求时都被执行,如果将自定义的中间件设置为全局中间件,需要将中间件添加到app\Http\Kernel.php文件中的$middleware数组中
特殊情况下不建议将业务级别中间件放到全局组件中
2.2.2 中间件组
中间件组可以通过一个键名将相关中间件分配给同一个路由。
通过设置app\Http\Kernel.php文件中的$middlewareGroups数组
其中
'web'
自动应用到routes\web.php中,'api'
自动应用到routes\api.php中
配置中间件
public function handle($request, Closure $next)
{
// 添加中间件逻辑
echo '执行';
return $next($request); //执行下一步操作
}
设置路由
Route::group(['middleware'=>['test']], function () {
Route::get('/', function () {
return view('welcome');
});
});
访问首页
2.2.3 指定路由中间件
分配中间件到指定路由,需要在app\Http\Kernel.php文件的$routeMiddleware
数组中给中间件分配一个key。默认情况下,类中的$routeMiddleware
数组包含了Laravel自带的中间件,如果要添加自定义的中间件,只需在该数组中追加一组键值对即可。
在路由规则中,调用middleware()方法将中间件分配到路由:
Route::get('text/index','TestController@form')->middleware('test');
2.3 利用中间件验证用户登录
在Web应用开发中,经常需要实现用户登录的功能。假设有一个名称为“Tom”的用户,当该用户进入网站首页时,如果还未登录,则页面会自动跳转到登录页面。当用户登录时,如果用户名和密码都正确,则登录成功,并利用Session 保存用户的登录状态;否则,提示用户名或密码输入不正确,登录失败。
在Laravel 框架中实现用户登录功能,其实现思路大致如下。
-
创建登录页面,在登录页面的
<form>
表单显示用户名、密码输入框和“登录”按钮。 -
接收用户登录的表单,使用自动验证规则对表单数据进行验证,判断用户名和密码是否正确,如果正确,将用户的登录状态保存到Session 中。
-
创建验证用户登录的中间件,在中间件中验证Session 中是否存在用户信息,如果存在则显示首页,否则跳转到登录页面。
-
创建首页,在打开首页时,执行验证用户登录的中间件。
-
创建UserController,添加login方法显示登录页面
public function login()
{
return view('user.login');
}
- 创建视图 login.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="{{route('check')}}" method="post">
用户名:<input type="text" name="name" id=""><br>
密码: <input type="password" name="password" id=""><br>
{{csrf_field()}}
<input type="submit" value="登录">
</form>
</body>
</html>
- 配置路由
Route::get('user/login','UserController@login');
- 在控制器中创建接收用户提交登录的方法
public function check(Request $request)
{
// 传入数据
$name=$request->input('name');
$password=$request->input('password');
// 验证规则
$rule=[
'name'=>'required',
'password'=>'required'
];
$message=[
'name.required'=>'用户名不能为空',
'password.required'=>'密码不能为空',
];
$validator=Validator::make($request->all(),$rule,$message);
// 输出验证结果
if($validator->fails()){
foreach ($validator->getMessageBag()->toArray() as $v){
$msg=$v[0];
}
return $msg;
}
// 判断用户名和密码是否正确
if ($name!='admin'|| $password!='123456') {
return '用户密码正确';
}
session(['users'=>['id'=>1,'name'=>'admin']]);
return '登录成功!';
}
- 配置路由规则
Route::post('user/check','UserController@check')->name('check');
- 修改视图提交位置
<form action="{{route('check')}}" method="post">
在控制器中引入实例余自动验证的命名空间
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
-
创建网站首页
web.php
Route::get('user/index','UserController@index');
index.blade.php
<h1>首页</h1>
-
验证网站首页登录状态,创建中间件
public function handle($request, Closure $next) { if (!session()->has('users')) { return redirect('/user/login'); } return $next($request); }
- 把中间件注册到指定路由里面
-
在路由里面配置路由规则
Route::get('user/index','UserController@index')->middleware('user');
-
访问首页,如果没有登录会自动返回登录页面
3. Auth认证
Laravel提供了一套完整的用户认证体系,称为Auth认证。Auth认证遵循开箱即用原则,通过简单的命令安装后即可使用。
3.1 什么是Auth认证
在网站开发中,由于用户注册、用户登录和找回密码等功能已成为网站必备的基础功能,Laravel框架将这些功能作为独立的部分抽象出来,供开发者使用,从而极大地提高了开发效率。
Auth认证的配置文件:config\auth.php
3.2 在项目中使用Auth认证
① 安装Auth认证
使用Auth认证前需要安装,在命令行中切换至项目根目录,执行命令安装Auth认证。
php artisan make:auth
② 自动生成Auth认证模块的路由
③ 安装和执行迁移
创建Auth认证所需的users表和password_resets表。
php artisan migrate:install //安装
php artisan migrate //执行
④ 访问相关链接