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()

{

    //

}]);

 

你可能感兴趣的:(laravel)