Laravel 5,Entrust - 检查角色不起作用

时间:2015-03-14 10:23:34

标签: php laravel-5

我是Laravel的新人。我试图在Laravel 5 Zizaco /委托中使用(来自laravel-5分支)。一切正常 - 附加规则,分离规则......但是当我尝试检查权限时,我遇到了问题。

首先我尝试使用routes.php,但在这个地方,Entrust不知道我是谁,hasRolerouteNeedsRole没有在routes.php中工作。

在中间件hasRole正在运行但routeNeedsRole没有。尝试用作第二个参数字符串,数组,效果相同 - abort(403)运行。

因为hasRole正在运行,这个问题对我来说非常奇怪。

composer dump-autoload - 使用,不解决问题

在routes.php中

Entrust::hasRole('superadmin');// => false
\Entrust::routeNeedsRole('admin/dashboard', ['superadmin'], abort(403, 'Forbidden'), false); // display 403 page
中间件

\Entrust::hasRole('superadmin'); // => true
\Entrust::routeNeedsRole('admin/dashboard', ['superadmin'], abort(403, 'Forbidden'), false); // display 403 page

我的模特 User.php

use Zizaco\Entrust\Traits\EntrustUserTrait;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

use Authenticatable, CanResetPassword, EntrustUserTrait;

routes.php文件

Route::group([ 'prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => ['auth', 'admin']], function (){
    Route::get('dashboard', [ 'as' => 'dashboard', 'uses' => "DashBoardController@index" ]);
});

我还有角色和权限模型,如自述文件https://github.com/Zizaco/entrust/tree/laravel-5

对不起我的英语。

3 个答案:

答案 0 :(得分:11)

更新: Laravel 5.1.11及更新版本现在内置Authorization。 Laravel非常友好,并且将始终得到很好的维护。 尽可能使用


您正在使用中间件错误。 Entrust的文档中还有很多Laravel 4的东西,所以你必须选择从那里使用的东西。中间件不应该设置routeNeedsRole。实际上routeNeedsRole在我看来并不适合L5。我将如何做到这一点:

使用

创建新的中间件
php artisan make:middleware AuthAdmin

现在在新生成的app / Http / Middleware / AuthAdmin.php

<?php namespace App\Http\Middleware;

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

class AuthAdmin {

  protected $auth;

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

  public function handle($request, Closure $next) {
    if ($this->auth->guest()) {
      if ($request->ajax()) {
        return response('Unauthorized.', 401);
      } else {
        return redirect()->guest('auth/login');
      }
    } else if(! $request->user()->hasRole('superadmin')) {
      return abort(404); //Or redirect() or whatever you want
    }
    return $next($request);
  }

}

这将与auth中间件做同样的事情,但是如果他们已经登录并且没有超级运算符&#39;他们将获得404的角色。

接下来,我们需要将中间件添加到routemiddleware中。在app/Http/Kernal.php中执行此操作:

protected $routeMiddleware = [
  ...,
  'superadmin' => 'App\Http\Middleware\AuthAdmin',
];

这使得可以将中间件添加到控制器。现在让我们这样做。在您的控制器中,我们在构造函数中执行此操作:

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

这会将中间件添加到整个控制器。如果需要,您可以具体说明路线,但对于您的情况,我认为我们需要保护整个控制器。

如果您需要更多帮助,请告诉我。

注意:让AuthAdmin运行&#39; auth&#39;中间件首先不是复制代码,但我不知道如何从中间件中做到这一点,我们不想做middleware => ['auth', 'superadmin']而不仅仅是'superadmin'。如果我们没有复制&#39; auth&#39;代码,我们会尝试获取null ->hasRole(),这将导致错误。

答案 1 :(得分:0)

在您的控制器中尝试:

验证::用户() - &GT; hasRole(&#39;超级管理员&#39);

答案 2 :(得分:0)

就我而言,这是一个缓存问题,一旦我清除了我的应用程序缓存-它解决了我遇到的403权限被拒绝的问题。

php artisan cache:clear