拉拉维尔 5,委托 - 检查角色不起作用


Laravel 5, Entrust - check roles not working

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

首先我尝试路线.php,但在这个地方,委托不知道我是谁,hasRolerouteNeedsRole不在路线上工作.php。

在中间件中,hasRole可以工作,但routeNeedsRole不能。 尝试用作第二个参数字符串,数组,相同的效果 - abort(403)运行。

因为hasRole正在工作,所以这个问题对我来说看起来很奇怪。

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

在路线中.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

我的模型用户.php

use Zizaco'Entrust'Traits'EntrustUserTrait;
class User extends Model implements AuthenticatableContract, CanResetPasswordContract {
use Authenticatable, CanResetPassword, EntrustUserTrait;

路线.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

对不起我的英语。

更新:Laravel 5.1.11 及更高版本现在带有内置授权。它更加友好,并将始终得到良好的维护。尽可能使用它


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

使用 创建新的中间件

php artisan make:middleware AuthAdmin

现在在新生成的应用程序中/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);
  }
}

这将执行与身份验证中间件相同的操作,但如果他们已经登录并且没有"超级管理员"角色,他们将获得 404。

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

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

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

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

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

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

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

在控制器中尝试一下:

Auth::user()->hasRole('superadmin');

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

php artisan cache:clear