Laravel之中间件

一.中间件的作用

HTTP 中间件提供了一个便利的机制来过滤进入应用的 HTTP 请求。例如,Laravel 包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就
会允许请求继续往前进入下一步操作。

当然,除了认证之外,中间件还可以被用来处理更多其它任务。比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求。
Laravel 框架内置了一些中间件,包括维护模式中间件、认证、CSRF 保护中间件等等。所有的中间件都位于app/Http/Middleware 目录。

二.定义中间件

1.命令

php artisan make:middleware OldMiddleware

  

这个命令会在app/Http/Middleware 目录下创建一个新的中间件类OldMiddleware,并且自动生成handle方法 ,在这个中间件中,我们只允许提供的 age 大于 200 的访问路由,否则,我们将用户重定向到主页:

<?php
namespace App\Http\Middleware;
use Closure;
class OldMiddleware
{
	/**
	* 返回请求过滤器
	*
	* @param \Illuminate\Http\Request $request
	* @param \Closure $next
	* @return mixed
	*/
	public function handle($request, Closure $next)
	{
		if ($request->input(‘age‘) <= 200) {
			return redirect(‘home‘);
		}
		return $next($request);
	}
}  

理解中间件的最好方式就是将中间件看做 HTTP 请求到达目标之前必须经过的“层”,每一层都会检查请求甚至会完全拒绝它

2.中间件之前/之后

a.请求前处理
class BeforeMiddleware
{
	public function handle($request, Closure $next)
	{
		// 执行动作
		return $next($request);
	}
}

b.请求后处理
class AfterMiddleware
{
	public function handle($request, Closure $next)
	{
		$response = $next($request);
		// 执行动作
		return $response;
	}
}

  

三.使用中间件

要想让中间件起作用,必须要注册中间件.

1.全局注册
如果你想要中间件在每一个 HTTP 请求期间被执行,,只需要将相应的中间件类放到app/Http/Kernel.php 的数组属性$middleware 中即可

2.在路由和控制器中使用中间件(局部)
a.首先应该在app/Http/Kernel.php 文件中分配给该中间件一个简写的 key,默认情况下,该类的$routeMiddleware 属性包含了 Laravel 内置的入口中间件,添加你自己的中间件只需要将其追加到后面并为其分配一个 key:

protected $routeMiddleware = [
		‘auth‘ => \App\Http\Middleware\Authenticate::class,
		‘auth.basic‘ => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
		‘guest‘ => \App\Http\Middleware\RedirectIfAuthenticated::class,
		‘test‘ => \App\Http\Middleware\TestMiddleware::class,
	];

  

b.在路由中使用

Route::get(‘admin/profile‘, [‘middleware‘ => ‘test‘, function () {}]);

或者

Route::get(‘admin/profile‘, [‘middleware‘ => ‘test‘, ‘[email protected]‘]);

c.在控制器中使用

$this->middleware(‘auth‘);

四.中间件参数

中间件还可以接收额外的自定义参数,比如,如果应用需要在执行动作之前验证认证用户是否拥有指定的角色,可以创建一个RoleMiddleware 来接收角色名作为额外参数。 额外的中间件参数会在$next 参数之后传入中间件:

<?php
namespace App\Http\Middleware;
use Closure;
class RoleMiddleware
{
	/**
	* 运行请求过滤器
	*
	* @param \Illuminate\Http\Request $request
	* @param \Closure $next
	* @param string $role
	* @return mixed
	* translator http://laravelacademy.org
	*/
	public function handle($request, Closure $next, $role)
	{
		if (! $request->user()->hasRole($role)) {
			// Redirect...
		}
		return $next($request);
	}
}

  

中间件参数可以在定义路由时通过:分隔中间件名和参数名来指定,多个中间件参数可以通过逗号分隔:

Route::put(‘post/{id}‘, [‘middleware‘ => ‘role:editor‘, function ($id) {
//
}]);

  

五.可终止的中间件

有时候中间件可能需要在 HTTP 响应发送到浏览器之后做一些工作。比如,Laravel 内置的“session”中间件会在响应发送到浏览器之后将 session 数据写到存储器中,为了实现这个,定义一个可终止的中间件并添加terminate 方法到这个中间件:

<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
	public function handle($request, Closure $next)
	{
		return $next($request);
	}
	public function terminate($request, $response)
	{
		// 存储 session 数据...
	}
}

  

terminate 方法将会接收请求和响应作为参数。一旦你定义了一个可终止的中间件,应该将其加入到 HTTP kernel 的全局中间件列表中。 当调用中间件上的terminate 方法时,Laravel 将会从服务容器中取出该中间件的新的实例,如果你想要在调用handle 和terminate 方法时使用同一个中间件实例,则需要使用容器的singleton 方法将该中间件注册到容器中。

时间: 2024-11-05 01:28:09

Laravel之中间件的相关文章

Laravel Middleware 中间件笔记

Laravel的中间件可以方便的过滤进入我们网页的请求.包括用户授权,CORS来指定流出请求的header等. 定义一个新的中间件可以使用命令: php artisan make:middleware AgeMiddleware 这条命令在app/Http/Middleware中创建AgeMiddleware类. 我们假设我们过滤所有年龄小于200的请求: <?php namespace App\Http\Middleware; use Closure; class AgeMiddleware

Laravel 使用中间件进行权限控制

Laravel 使用中间件进行权限控制 飞凡的陀螺 关注 2018.01.24 17:45 字数 264 阅读 1138评论 0喜欢 1 先看 文档Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求.这里实现一个只有admin角色才能访问特定路由的功能 新建middlewarephp artisan make:middleware MustBeAdmin 打开生成的 \app\Http\Middleware\MustBeAdmin.php 修改handle方法关于hasR

laravel的中间件

laravel中间件的使用 laravel内置了一个中间件来验证用户是否经过认证,如果用户没有经过认证,中间件会将用户重定向到登录页面,否则如果用户经过认证,中间件就会允许请求继续往前进入下一步操作. 当然,除了认证之外,中间件还可以被用来处理更多其它任务.比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域):日志中间件可以记录所有进入站点的请求. Laravel框架自带了一些中间件,包括认证.CSRF 保护中间件等等.所有的中间件都位于 app/Http/Middleware目录

laravel 拾遗 中间件

Problem You want to add middleware to your application but don't know where to begin. Solution Create a simple middleware class. Step 1 - Create the class <?php namespace MyApp; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Http

laravel 加中间件的方法 防止直接打开后台

路由 routes.php Route::group(['middleware' => ['web','admin.login.login']], function () { //后台首页路由 Route::get('/admin/index/index','Admin\[email protected]'); }); kernel.php protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::c

laravel在中间件内生成的变量如何传到控制器

在中间件内获取到一个变量,如何返回到控制器中并使用这个变量! 做了个demo: // web.php Route::get('/check', '[email protected]')->middleware(App\Http\Middleware\CheckRequest::class); // Middleware/CheckRequest.php class CheckRequest { /** * Handle an incoming request. * * @param \Illum

Laravel中间件原理

本文和大家分享的主要是Laravel中间件原理相关内容,一起来看看吧,希望对大家学习Laravel有所帮助. Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求, 如 ValidatePostSize 用来验证 POST 请求体大小. ThrottleRequests 用于限制请求频率等. 那Laravel的中间件是怎样工作的呢? 启动流程 再说 Laravel 中间件前,我们先来理一理 laravel 的启动流程 首先,入口文件 index.php 加载了 autolo

Laravel系列之CMS系统学习 — 角色、权限配置【1】

一.后台Admin模块 后台管理是有管理员的,甚至超级管理员,所以在设计数据表的时候,就会有2个方案,一个方案是共用users数据表,添加is_admin,is_superAdmin字段来进行验证,或者将用户编到不同的组里面,另一个方案是,单独创建admins数据表来进行管理(这样前台和后台是两个事件,前台用户是没有机会操作后台相关功能的,也就是完全隔离了) 我采用第二种(实习快四个月了,跟了2个完整项目是这样~) 我在上一篇说到,我使用的是laravel-module,所以相关初始配置不再赘述

laravel5.2总结--csrf保护

CSRF攻击: CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作.我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的.所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求. Laravel 会自动生成一个 CSRF token 给每个用户的 Session.该 t