我是Laravel的新手.我正在尝试使用Laravel 5 Zizaco /委托(来自laravel-5分支).所有工作正常 - 附加规则,分离规则......但是当我尝试检查权限时,我遇到了问题.
首先,我尝试在routes.php文件,但在这个地方委托不知道我是谁,hasRole而routeNeedsRole在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,这将导致错误.