【问题标题】:Laravel 5, Entrust - check roles not workingLaravel 5,委托 - 检查角色不起作用
【发布时间】:2020-09-19 07:02:18
【问题描述】:

我是 Laravel 的新手。我正在尝试在 Laravel 5 Zizaco/entrust 中使用(来自 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

//对不起我的英语。

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

    更新: 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 中间件做同样的事情,但如果他们已经登录并且没有“超级管理员”角色,他们将获得 404。

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

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

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

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

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

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

    注意:最好让 AuthAdmin 先运行“auth”中间件,而不是复制代码,但我不知道如何从中间件中执行此操作,我们也不知道想做middleware =&gt; ['auth', 'superadmin'] 而不仅仅是'superadmin'。如果我们不复制 'auth' 代码,我们将尝试获取 -&gt;hasRole() of null ,这会出错。

    【讨论】:

    • 好的,详细的答案,它对我很有用。这应该被 OP 标记为选择的答案。
    【解决方案2】:

    在您的控制器中尝试:

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

    【讨论】:

    • 感谢您的回复,但我需要使用 Entrust。
    • 根据 Entrust 文档,这与使用 Entrust::hasRole('superadmin');
    【解决方案3】:

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

    php artisan cache:clear
    

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2015-04-23
      • 2017-01-16
      • 2023-03-26
      相关资源
      最近更新 更多