Laravel 权限控制整理--中间件

简介

HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。

当然,除了身份验证之外,中间件也可以被用来执行各式各样的任务,CORS 中间件负责替所有即将离开程序的响应加入适当的响应头,一个日志中间件可以记录所有传入应用程序的请求。 Laravel 框架已经内置一些中间件,包括维护、身份验证、CSRF 保护,等等。所有的中间件都位于 app/Http/Middleware 目录内。

理解:假设你的应用——路由,控制器,业务逻辑——是图中的绿色部分,从图中可以清晰地看到,用户请求先经由多个中间层才能到达你的应用,然后再经由更多的中间层进行处理。每个特定的中间层都可以在应用逻辑之前、之后进行处理,或者同时在应用逻辑之前和之后进行处理。

这就是 middleware 实现修饰模式的工作方式:它捕获请求,做一些处理,然后把处理后的请求对象返回给下一个堆栈层。

Laravel 默认使用 middleware 来处理加密/解密和 cookies 队列、读取和写入 sessions, 但除此之外你还可以用 middleware 来向请求/响应环中加入你需要的任何一种操作层。比如速率限制、自定义请求解析等。

创建

要建立一个新的中间件,可以使用 make:middleware 这个 Artisan 命令:

php artisan make:middleware OldMiddleware

此命令将会 在 app/Http/Middleware 目录内置立一个名称为 OldMiddleware 的类。在这个中间件内我们只允许 年龄 大于 200 的才能访问路由,否则,我们会将用户重新导向 「home」 的 URI。

<?php namespace App\Http\Middleware;

class OldMiddleware {
    /**
     * Run the request filter.
     *
     * @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);
    }
}

如你所见,所有 middleware 的基础是 handle 方法,它接受两个参数:

$request : Illuminate Request 对象

$next : Closure(匿名函数), 该函数把 request 对象传递给后续的 middleware

其实也就是实现了filter的作用。

Before / After 中间件

在一个请求前后指定某个中间件取决于这个中间件自身。这个中间件可以执行在请求前执行一些 前置 操作:

<?php namespace App\Http\Middleware;
class BeforeMiddleware implements Middleware {
    public function handle($request, Closure $next)
    {
        // Perform action
        return $next($request);
    }
}

然后,这个中间件也可以在请求后执行一些 后置 操作:

<?php namespace App\Http\Middleware;
class AfterMiddleware implements Middleware {
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        // Perform action
        return $response;
    }
}

注册/使用中间件

1. 全局中间件

若是希望中间件被所有的 HTTP 请求给执行,只要将中间件的类加入到 app/Http/Kernel.php 的 $middleware 属性清单列表中。

/**
   * The application‘s global HTTP middleware stack.
   *
   * @var array
   */
  protected $middleware = [
    ‘Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode‘,
    ‘Illuminate\Cookie\Middleware\EncryptCookies‘,
    ‘Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse‘,
    ‘Illuminate\Session\Middleware\StartSession‘,
    ‘Illuminate\View\Middleware\ShareErrorsFromSession‘,
    ‘App\Http\Middleware\VerifyCsrfToken‘,
    ‘App\Http\Middleware\OldMiddleware‘,  //注册使用
  ];

2.指派中间件给路由

如果你要指派中间件给特定的路由,你得先将中间件在 app/Http/Kernel.php 配置一个键值,默认情况下,这个文件内的 $routeMiddleware 属性已包含了 Laravel 目前配置的中间件,你只需要在清单列表中加上一组自定义的键值即可。 中间件一旦在 HTTP kernel 文件内被定义,你即可在路由选项内使用 middleware 键值来指派。

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

2. 路由使用中间件

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

3. 控制器中使用中间件

...
use Illuminate\Routing\Controller;
class AwesomeController extends Controller {
  public function __construct()
  {
    $this->middleware(‘csrf‘);
    $this->middleware(‘auth‘, [‘only‘ => ‘update‘])
  }
}

可终止中间件

有些时候中间件需要在 HTTP 响应已被发送到用户端之后才执行,例如,Laravel 内置的「session」中间件,保存session数据是在响应已被发送到用户端 之后 才执行。为了做到这一点,你需要定义中间件为「可终止的」。

use Closure;
use Illuminate\Contracts\Routing\TerminableMiddleware;

class StartSession implements TerminableMiddleware {
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
    public function terminate($request, $response)
    {
        // Store the session data...
    }
}

如你所见,除了定义 handle 方法之外, TerminableMiddleware 定义一个 terminate 方法。这个方法接收请求和响应。一旦定义了 terminable 中间件,你需要将它增加到 HTTP kernel 文件的全局中间件清单列表中。

时间: 2024-10-29 19:11:39

Laravel 权限控制整理--中间件的相关文章

Laravel 权限控制整理--Auth

用户认证 1. 自带用户认证 简介 Laravel 让实现认证机制变得非常简单.事实上,几乎所有的设置默认就已经完成了.有关认证的配置文件都放在 config/auth.php 里,而在这些文件里也都包含了良好的注释描述每一个选项的所对应的认证服务. Laravel 默认在 app 文件夹内就包含了一个使用默认 Eloquent 认证驱动的 App\User模型. 注意:当为这个认证模型设计数据库结构时,密码字段至少有60个字符宽度.同样,在开始之前,请先确认您的 users (或其他同义) 数

laravel权限控制

Permissions Tiny Laravel 4 package for handling user roles and permissions. Installation Add the following to the require key of your composer.json file: "mrterryh/permissions": "dev-master" Run $ composer update. Navigate to your conf

laravel权限控制Gate

实现思想 注册 位置: app/Providers/AuthServiceProvider.php $permissions = \App\AdminPermission::all(); foreach ($permissions as $permission){ Gate::define($permission->name,function ($user) use($permission){ return $user->hasPermission($permission); }); } 路由

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

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring

iOS应用部分权限控制

整理下iOS开发中常用的权限控制,只整理里一些常用的并不全. #import <Foundation/Foundation.h> typedef void (^AuthorizedFinishBlock)(); @interface LYAuthorizedMaster : NSObject #pragma mark - 摄像头权限 +(BOOL)checkCameraAuthority; +(void)cameraAuthorityCheckSuccess:(AuthorizedFinish

Android笔记(七十三) Android权限问题整理 非常全面

Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~150

浅谈Yii-admin的权限控制

说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等.最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门老大下面分子部门等等,恶心的需求.我们这个项目使用yii框架开发,yii在php届还是比较流行的,虽然说laravel现在横行,但是一些部门一些团队还是采用了yii框架,比如我们. 我是刚接触yii这个框架,开始的时候对这种面向组件的框架甚是别扭.当时打算自己写权限的,自己创建权限表,关联表等,但是

2.4.4.3、Django用user表last_name字段做权限控制

这不是最好的方法! 数据库User表中因为是系统初始化的表,如果添加额外的字段需要修改django源文件,不利于移植,为避免带来其他问题,可以使用last_name字段做为权限控制,当然也可以用profile方法为user表添加新字段(对于user表示一对一关系,但不是在User表中),session在用户登录之后会一直存储user的信息,所以用user表中的字段在html中引用实现更简单一点(group可以在视图里使用) 如下图: 在http://10.1.1.145:8000/admin/a