Laravel中间件。一步一步的完整指南

282 阅读6分钟

How To Use Middleware in Laravel 5 Tutorial

任何网络应用的主要要求之一是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中注册这个路由。

你可以用两种不同的方式注册这个路由。

  1. 你可以作为一个全局中间件注册**。**
  2. 你可以注册为一个特定的路由 ,称为路由中间件

我们是作为路由中间件注册的,所以,去看看受保护的$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 5 middleware tutorial

登录后, 我的屏幕看起来是这样的.

Laravel 5.4 Middleware

你是以管理员身份登录的, 所以; 你可以看到下面的页面.

如果你是以普通用户的身份登录的, 你会重定向到和我们一样的页面; 这是一个主页, 有以下错误.

Laravel Route Middleware

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代码的步骤

  1. 克隆你本地的 repo.
  2. 进入项目的根目录并运行 "composer update "命令.
  3. 然后,编辑.env文件并使用你的MySQL数据库凭证。
  4. 用户表中添加一个管理字段。
  5. 运行命令,"php artisan migrate"。
  6. 我们需要启动Laravel服务器, 所以运行 "php artisan serve."
  7. 如果现在去这个网址**:http://localhost:8000/registerandcreate**三个新的用户,并把其中一个用户的管理值改为**一个**
  8. 现在像三个不同的用户一样登录,并点击主页上的管理链接;如果你在该链接的路由中应用中间件,就会像上面描述的那样工作。

推荐文章

Laravel JWT认证

拉威尔Stripe

淘宝网

淘宝网上有很多卖家,他们都有自己的淘宝网店。

拉威尔的闸门

The postLaravel Middleware:一步一步的完整指南出现在AppDividend上。