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

Grz*_*sak 5 php laravel-5

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

首先,我尝试在routes.php文件,但在这个地方委托不知道我是谁,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
Run Code Online (Sandbox Code Playgroud)

在中间件中

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

我的模型User.php

use Zizaco\Entrust\Traits\EntrustUserTrait;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

use Authenticatable, CanResetPassword, EntrustUserTrait;
Run Code Online (Sandbox Code Playgroud)

routes.php文件

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

我也有角色和权限模型在自述文件中看起来像https://github.com/Zizaco/entrust/tree/laravel-5

// 对不起我的英语不好.

Dut*_*IFF 11

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


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

用.创建一个新的中间件

php artisan make:middleware AuthAdmin
Run Code Online (Sandbox Code Playgroud)

现在在新生成的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);
  }

}
Run Code Online (Sandbox Code Playgroud)

这将与auth中间件做同样的事情,但如果他们已经登录并且没有'superadmin'角色,他们将获得404.

接下来,我们需要将中间件添加到routemiddleware.这样做app/Http/Kernal.php:

protected $routeMiddleware = [
  ...,
  'superadmin' => 'App\Http\Middleware\AuthAdmin',
];
Run Code Online (Sandbox Code Playgroud)

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

public function __construct() {
  $this->middleware('superadmin');
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 好的,详细的答案,对我来说很有用.这应该被OP标记为选择的答案. (2认同)

小智 1

在你的控制器中尝试一下:

Auth::user()->hasRole('超级管理员');