我是Laravel的新人。我试图在Laravel 5 Zizaco /委托中使用(来自laravel-5分支)。一切正常 - 附加规则,分离规则......但是当我尝试检查权限时,我遇到了问题。
首先我尝试使用routes.php,但在这个地方,Entrust不知道我是谁,hasRole
和routeNeedsRole
没有在routes.php中工作。
在中间件hasRole
正在运行但routeNeedsRole
没有。尝试用作第二个参数字符串,数组,效果相同 - abort(403)
运行。
因为hasRole
正在运行,这个问题对我来说非常奇怪。
composer dump-autoload
- 使用,不解决问题
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
对不起我的英语。
答案 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