我是拉拉维尔的新人。我正在尝试在 Laravel 5 Zizaco/entrust 中使用(来自 laravel-5 分支)。一切正常 - 附加规则,分离规则...但是当我尝试检查权限时,我遇到了问题。
首先我尝试路线.php,但在这个地方,委托不知道我是谁,hasRole
和routeNeedsRole
不在路线上工作.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