laravel5学习之中间件访问控制

如果控制文章的添加只有登录的用户才可以操纵,可以加判断如下

 public function create(){

        //这个虽然可以达到控制登陆用户访问的目的 但是需要写很多

        if(Auth::guest()){
            return redirect(‘auth/login‘);
        }
        return view(‘articles.create‘);
    }

文件Http-->Middleware-->Authenticate.php就是对应的权限控制文件,在Http-->Kernel.php中有如下代码

/**
     * The application‘s route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        ‘auth‘ => ‘App\Http\Middleware\Authenticate‘,//auth  对应的就是上面的那个文件
        ‘auth.basic‘ => ‘Illuminate\Auth\Middleware\AuthenticateWithBasicAuth‘,
        ‘guest‘ => ‘App\Http\Middleware\RedirectIfAuthenticated‘,
    ];

每个方法前添加控制权限的方法太繁琐了,简单的方法,可以在控制器的构造函数里来控制,比如在文章的类里ArticleController.php中

    public function __construct(){
//        $this->middleware(‘auth‘,[‘only‘=>‘create‘]);
        $this->middleware(‘auth‘,[‘except‘=>‘index‘]);
    }

更简单的方法可以在route.php中来进行控制

//可以在这里书写权限控制规则
Route::get(‘about‘,[‘middleware‘=>‘auth‘,function(){
    return "you have to sign in to look this page";
}]);

其他的一些中间件   在kernel.php中除了上面的内容,还有

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‘,
    ];

其中的CheckForMaintenanceMode就是检验是否是维护模式。

在命令行下执行  php artisan down  进入维护模式,如果再访问的时候会呈现维护的默认页面,这个是通过上面这个CheckForMaintenanceMode来实现的。 执行php artisan up 退出维护模式。

执行php artisan down时候,在storage-->framework下生成一个down文件,反之则删除了down文件。执行的原理如下。

先去去看下CheckForMaintenanceMode.php这个文件的内容

<?php namespace Illuminate\Foundation\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Contracts\Foundation\Application;
use Symfony\Component\HttpKernel\Exception\HttpException;

class CheckForMaintenanceMode implements Middleware {

    /**
     * The application implementation.
     *
     * @var \Illuminate\Contracts\Foundation\Application
     */
    protected $app;

    /**
     * Create a new filter instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function __construct(Application $app)
    {
        $this->app = $app;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->app->isDownForMaintenance())
        {
            throw new HttpException(503);
        }

        return $next($request);
    }

}

再去看下isDownForMaintenance()

public function isDownForMaintenance()
    {
        return file_exists($this->storagePath().‘/framework/down‘);
    }

其原理一目了然。

建立自己的中间件

E:\www\laravel>php artisan make:middleware Demo
Middleware created successfully.

在middleware中生成了Demo.php文件,内容如下(添加的内容是红字部分)

<?php namespace App\Http\Middleware;

use Closure;

class Demo {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {    
if($request->is(‘article/create‘) && $request->has(‘foo‘)){  //检验执行的方法是否是article  并且含有参数foo   return redirect(‘article‘);}
return $next($request); } }

如果是访问的是article/create  并且带有参数foo的,将会执行article。其他的将继续执行。

在kernel.php中添加对应的,如下(红色部分)

<?php namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {

    /**
     * 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\Demo‘,
    ];

    /**
     * The application‘s route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        ‘auth‘ => ‘App\Http\Middleware\Authenticate‘,
        ‘auth.basic‘ => ‘Illuminate\Auth\Middleware\AuthenticateWithBasicAuth‘,
        ‘guest‘ => ‘App\Http\Middleware\RedirectIfAuthenticated‘,
    ];

}

这个时候如果用/article/create?foo=12 来访问的话将会跳转到article中去。

全局中间件

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

指派中间件给路由

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

Route::get(‘admin/profile‘, [‘middleware‘ => ‘auth‘, function()
{
    //
}]);
时间: 2024-10-16 07:21:28

laravel5学习之中间件访问控制的相关文章

scrapy 爬虫学习二[中间件的学习]

scrapy源码解析参考连接:https://www.jianshu.com/p/d492adf17312 ,直接看大佬的就行了,这里便就不多说了. 今天要学习的是:Scrapy框架中的download middlerware[下载中间件]用法. 一:官方文档中,对下载中间件的解释如下 下载中间件是介于scrapy的requests/response处理的钩子框架,是用于全局修改scrapy requests和response的一个轻量.底层的系统. 二:使用下载器中间件时必须激活这个中间件,方

8. Laravel5学习笔记:在laravel5中使用OAuth授权

OAuth2.0简介 关于它的介绍,给出以下两篇文章,相信看完,应该对它有一定程度的了解: [1] 理解OAuth 2.0 -- 阮一峰 [2] 帮你深入理解OAuth2.0协议 -- seccloud 这里我主要阐述的是在laravel5中使用OAuth2.0.关于这个协议本身,以及运行流程希望大家看完以上两篇文章,理解后,再看我后面的内容! Laravel5中安装OAuth2.0 OAuth2.0在官方中提供了 php的库 ,但是我们这里并不直接使用它官方提供的 Server Librari

7. Laravel5学习笔记:如何定义自己的视图组件

视图组件 视图组件就是在视图被渲染前,会调用的闭包或类方法.如果你想在每次渲染某些视图时绑定数据,视图组件可以把这样的程序逻辑组织在同一个地方. 对上面的话,理解如下: 这个php代码运行的时间是在渲染视图之前 使用这个组件应该用于每次渲染时,都要绑定数据的视图上.这样子就可以从控制器分离出数据绑定逻辑. 它很好的提现了 单一职责 ,对它的概念阐述 请看这里 使用 在laravel5的文档中已经说明了如何构建自己的视图组件.这里在重复一下. 先构建一个视图组件: <?php namespace

Laravel5.1 Middleware中间件(初级)

中间件?什么鬼? 大家第一次接触这个词都会有这么个疑问,但它其实没那么神秘. 一句话就可以解释它:过滤HTTP请求专用机制. 为什么要使用中间件? 过滤HTTP请求是可以写在别的地方,比如说控制器中 路由中,BUT 抽象出来就有它的理由,比如说Laravel自带的Auth中间件 它要求必须是登录进来的用户才有权访问 如果没有登录就跳转到登录页面,这样的逻辑在很多场景都会用到 这很明显了吧 你不可能在每个控制器或每一个路由都单独实现以便,直接抽出来多方便. 1 使用中间件 1.1 创建中间件 咱创

Laravel5 学习与使用(一)

2015-07-04 (1)  安装Laravel框架 ① 安装前的准备工作 使用Apache24 + PHP 5.6 + MySQL 开发环境完成PHP网站开发,所以Laravel的安装是建立在以上环境安装成功且能正常使用的前提下的. ② 安装Composer Laravel 框架使用 Composer 来管理其依赖性.所以,在你使用 Laravel 之前,你必须确认在你电脑上是否安装了 Composer.使用网上下载来的Composer-Setup.exe(点击进入网盘)安装包能很简单的安装

【CCNA学习笔记】访问控制列表

1.ACL定义 ACL(Access Control List,访问控制列表)是一系列运用到路由器接口的指令列表.这些指令告诉路由器接收哪些数据包.拒绝哪些数据包.接收或者拒绝根据一定的规则进行,如源地址.目标地址.端口号等.ACL使得用户能够管理数据流,检测特定的数据包.针对IP协议,在路由器的每一个端口,可以创建两个ACL:一个用于过滤进入(inbound)端口的数据流,另一个用于过滤流出(outbound)端口的数据流. 2.标准ACL 2.1.通配符掩码 路由器使用通配符掩码与源或目标地

中间件学习——J2EE中间件四步曲

前面的几篇文章我们已经介绍了中间件的相关知识了,这篇我们文章我们了解下J2EE中间件.关于J2EE上一篇我们我们进行过初步的介绍,了解到J2EE它是一个规范与标准,这篇文章要介绍的内容有J2EE中间件技术.J2EE应用服务器中间件的体系结构和J2EE技术与.NET技术的比较. J2EE中间件技术 J2EE体系 J2EE这个规范是应用服务器采用的主要技术体系,与其它的中间件系统相比较,它具有非常显著的特征,而特征来自它独特的体系结构. 比如企业现在需要通过他们为他们的客户.合作伙伴.雇员和供应商提

Java面向对象学习笔记 -- 2(访问控制修饰符)

1. 访问控制修饰符(封装) 封装:将数据封装到类的内部,将算法封装到方法中. 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3)public:任何位置可见,可以修饰:类.成员属性.成员方法.内部类.跨包访问类(需要使用import语句导入),成员属性 = = 成员变量. 4)protected:当前包中可见,子类中可见.可以修饰:成员属性.成员方法.内部类(只能在类体中使用,

11.Laravel5学习笔记:扩展 Validator 类

简介 在 Laravel5 中,本身已经提供了丰富的验证规则供我们使用,但是天下应用奇葩多,做为程序员你会发现永远都有新的验证规则诞生,光是组合已经拯救不了你的项目了.这个时候就需要我们扩展 Validator 类,来使之帮助项目继续健康向前发展. 官方给了多种扩展 Validator 的方式,我独爱直接扩展该类,但是关于这一点,官文中又写的寥寥数语,确实新人有些无奈.这里详细说一下,如何扩展它. 扩展验证类 首先,扩展的收个问题是,我的扩展类应该放在哪儿才好呢?我的意见是:直接在app目录下,