码迷,mamicode.com
首页 > 其他好文 > 详细

laravel5学习之中间件访问控制

时间:2015-03-06 15:45:33      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

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

 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()
{
    //
}]);

 

laravel5学习之中间件访问控制

标签:

原文地址:http://www.cnblogs.com/webclz/p/4318187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!