Laravel 5.2锁定控制器,适用于部分用户

时间:2016-09-06 10:15:27

标签: laravel laravel-5.2 laravel-routing

我想锁定 AccountsController ,以便所有用户都希望用户为管理员用户 ..

  

例如:

Auth::user() -> roll != 'Admin'然后关闭 AccountsController ..

AccountsController构造代码:

    public function __construct()
    {
      $this->middleware('auth');
    }

1 个答案:

答案 0 :(得分:2)

Middleware是一个完全有效的解决方案,但我已针对此类情况切换到Gates。门使用起来更方便。我使用角色和权限以及hasRole方法来管理访问级别,但如果您的系统很简单,您可以轻松地在isAdmin模型上使用User方法检查标记在数据库中。

中间件

创建您的客户中间件。

<强> AuthenticateAdmin.php

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;

class AuthenticateAdmin {

  protected $auth;

  public function __construct(Guard $auth)
  {
    $this->auth = $auth;
  }

  public function handle($request, Closure $next)
  {
    if ($this->auth->user()->hasRole('admin'))
    {
     return $next($request);
    }
  }
}

将其添加到您的内核。

<强> Kernel.php

protected $routeMiddleware = [
    'auth' => Middleware\Authenticate::class,
    'auth.admin' => Middleware\AuthenticateAdmin::class,
];

然后您可以在控制器中使用中间件。

public function __construct()
{
  $this->middleware('auth.admin');
}

使用Gate,您可以添加在AuthServiceProvider中定义策略

<强> AuthServiceProvider.php

public function boot(GateContract $gate)
{
    parent::registerPolicies($gate);

    $gate->define('user-admin', function($user){
        return $user->hasRole('admin');
    });
}

然后将其添加到您的控制器或您需要的地方。

<强> Controller.php这样

public function show($slug)
{
  if (Gate::allows('user-admin')){
    return $yes;
  }
  return $no;
}