任何网络应用的主要要求之一是HTTP请求过滤,我们都需要很好地实现这一功能。Laravel PHP框架也提供了这个功能, 这个概念被称为**"Laravel中间件** ".
如果你想知道Laravel的基本CRUD功能, 那么请看我的文章Laravel Crud Example From Scratch
Laravel中间件
Laravel中间件, 正如它的名字所暗示的,实现了一些功能,在特定的URI上的请求击中。它就像层,我们需要把它放在我们的请求和响应之间。它为我们提供了非常灵活的API来做到这一点.
要在Laravel中实现自定义的 中间件, 只需要 一个命令, 就可以完成所有的设置。接下来, 我们 需要写逻辑到特定的功能,并在我们的应用程序中定义它。这就是了, 伙计们.好了, 让 我们 通过一些例子来深入了解 它.
第一步: 创建一个Laravel项目
在你的CMD中键入以下命令.
composer create-project laravel/laravel LaravelMiddleware --prefer-dist
进入phpMyAdmin,创建一个名为laravel middleware的数据库。你可以给它起任何名字。
切换到你的编辑器, 编辑**.env文件**并把你的数据库凭证放在里面.
步骤: 2 拉威尔管理中间件
现在, 要检查当前用户是否是管理员.所以去你的用户表迁移文件中添加一个字段,叫做isAdmin, 它的数据类型是布尔值。
<?php
// create_users_migrations
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email');
$table->string('password');
$table->boolean('isAdmin')->nullable();
$table->rememberToken();
$table->timestamps();
});
}
现在运行下面的命令。
php artisan migrate
下一步是创建Laravel提供的认证功能.所以在你的终端键入以下内容。
Laravel认证
php artisan make:auth
这样,认证脚手架就会成功生成。
通过输入以下命令来启动服务器.
php artisan serve
现在创建三个用户.所以去到下面的网址:http://localhost:8000/register.
我们没有分配任何用户给管理员, 但我们可以手动做。但是,记住,在实时网络应用中,你需要提供一些界面来赋予管理权限。
在这里,我只是展示了你如何在签入表格后处理管理中间件。
所以, 现在, 把任何用户的isAdmin字段手动分配到数据库中的值一 。
第三步:制作一个基本的Laravel中间件。
通过输入以下Laravel命令来创建一个中间件。
php artisan make:middleware Admin
导航到以下目录. app >> Http >> Middleware >> Admin.php
你可以看到有一些Laravel提供的模板。
主要有一个函数你必须处理,那就是 handle()
// Middleware Admin.php
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
我们需要在这个函数中编写逻辑来过滤请求, 如果满足了, 就转到目标页面; 否则, 就回到登录或任何你将提供的重定向页面.
我在这个函数中写了一个逻辑。
/** Admin.php
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(auth()->user()->isAdmin == 1){
return $next($request);
}
return redirect('home')->with('error','You have not admin access');
}
现在,我需要在app >> Http >> Kernel.php中注册这个路由。
你可以用两种不同的方式注册这个路由。
- 你可以作为一个全局中间件注册**。**
- 你可以注册为一个特定的路由 ,称为路由中间件。
我们是作为路由中间件注册的,所以,去看看受保护的$routeMiddleware属性。
<?php
// Kernel.php
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'admin' => \App\Http\Middleware\Admin::class,
];
在这里,你可以看到,我已经添加了我们的自定义中间件,叫做admin。
现在,如果我们想把任何路由分配给这个中间件admin,这些路由是受保护的,只有当授权用户是管理员时才能访问;否则,它将重定向到主页上。
第4步。 受管理员保护的路由中间件。
创建一个路由,它需要被管理员保护,如果用户不是管理员,它将重定向到**主页;**否则,他可以访问这个页面。
<?php
// web.php
Route::get('admin/routes', 'HomeController@admin')->middleware('admin');
我们需要在用户登录后把这个链接放在主页上。
<!-- home.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
@if(\Session::has('error'))
<div class="alert alert-danger">
{{\Session::get('error')}}
</div>
@endif
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Dashboard</div>
<div class="panel-body">
<a href="{{url('admin/routes')}}">Admin</a>
</div>
</div>
</div>
</div>
</div>
@endsection
我们所需要的是对驻扎在HomeController中的管理功能进行编码。
<?php
// HomeController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
public function admin()
{
return view('admin');
}
}
第5步:制作一个刀片文件。
在views文件夹的根部创建一个名为admin.blade.php的视图。
<!-- admin.blade.php -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ADMIN PAGE</title>
</head>
<body>
WELCOME TO ADMIN ROUTE
</body>
</html>
现在, 转到登录页面,用isAdmin字段1登录
这是我的Laravel的登录页面。
登录后, 我的屏幕看起来是这样的.
你是以管理员身份登录的, 所以; 你可以看到下面的页面.
如果你是以普通用户的身份登录的, 你会重定向到和我们一样的页面; 这是一个主页, 有以下错误.
Laravel组中间件
<?php
// web.php
Route::group(['middleware' => ['admin']], function () {
Route::get('admin/routes', 'HomeController@admin');
});
我们可以使用中间件组,将一个 中间件分配 给多个路由。这是毫不费力的。
如果我不想向普通用户显示管理链接,我已经放了一个条件,比如如果验证用户是管理员,那么,我们就可以向他显示该路由,否则就不显示。但在这个例子中,我没有放这样的东西。
我想告诉你,如果你不是管理员,但仍然试图访问这个路由,你将会被重定向,并得到一个适当的消息。
单个路由中的多个中间件
我们可以在一个路由中同时放入两个中间件。
Route::get('admin/routes', 'HomeController@admin')->middleware(['admin','auth']);
Laravel提供的认证中间件
<?php
// Kernel.php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}
auth和guest 中间件与用户的认证有关。
VerifyCSRFToken是另一个全局性的中间件, 它可以保护我们在每个POST请求中免受跨站请求伪造的攻击.
如果POST请求不包含CSRF Token,这个中间件会抛出TokenMismatchException。
这就是Laravel中间件的例子了。
Github代码
使用Github代码的步骤
- 克隆你本地的 repo.
- 进入项目的根目录并运行 "composer update "命令.
- 然后,编辑.env文件并使用你的MySQL数据库凭证。
- 在 用户表中添加一个管理字段。
- 运行命令,"php artisan migrate"。
- 我们需要启动Laravel服务器, 所以运行 "php artisan serve."
- 如果现在去这个网址**:http://localhost:8000/registerandcreate**三个新的用户,并把其中一个用户的管理值改为**一个**
- 现在像三个不同的用户一样登录,并点击主页上的管理链接;如果你在该链接的路由中应用中间件,就会像上面描述的那样工作。
推荐文章
The postLaravel Middleware:一步一步的完整指南出现在AppDividend上。