假设我有2个过滤器
1)管理员 2)SuperAdmin
过滤器:
Route::filter('Admin', function($route, $request)
{
if ( ! Auth::user()->Admin()) {
return Response::json(array('flash' => 'You are not authorized.'), 401);
}
});
Route::filter('SuperAdmin', function($route, $request)
{
if ( ! Auth::user()->SuperAdmin()) {
return Response::json(array('flash' => 'You are not authorized.'), 401);
}
});
路线:
Route::group(array('before' => array('auth|Admin')), function()
{
Route::get('/report/{id}','ReportCntrl@getreport');
Route::get('/create1','ReportCntrl@create1');
}
Route::group(array('before' => array('auth|SuperAdmin')), function()
{
Route::get('/report/{id}','ReportCntrl@getreport');
Route::get('/create2','ReportCntrl@create2');
Route::get('/create3','ReportCntrl@create3');
}
所以问题是当我从superadmin
登录时它表示未经授权的访问
因为我认为它将我的请求传递给两个过滤器并且一个批准它,然后第二个拒绝它。
我是否有任何方法可以实际使用来自Laravel中2个路线组的相同网址。
答案 0 :(得分:1)
您可以这样做:
Route::filter('AdminAndSuperAdmin', function($route, $request)
{
if ( ! Auth::user()->Admin() && ! Auth::user()->SuperAdmin()) {
return Response::json(array('flash' => 'You are not authorized.'), 401);
}
});
// this route will work for both admin and super admin
Route::group(array('before' => array('auth|AdminAndSuperAdmin')), function()
{
Route::get('/report/{id}','ReportCntrl@getreport');
}
Route::group(array('before' => array('auth|Admin')), function()
{
Route::get('/create1','ReportCntrl@create1');
}
Route::group(array('before' => array('auth|SuperAdmin')), function()
{
Route::get('/create2','ReportCntrl@create2');
Route::get('/create3','ReportCntrl@create3');
}
答案 1 :(得分:1)
由于定义顺序,分组Laravel路线可能会造成混淆。过滤器在之前路由定义,但在路由过程中首先匹配路由,然后才应用过滤器。
如果虚假的过滤器(比如说SuperAdmin == false)会让Laravel忽略这条路线,那么你想要达到的目标才有效。
我建议让Auth::user()->Admin()
评估为true
超级管理员。这样,相同的路线仍然可以工作,但所有不同的路线(组之间)都能正常工作。
答案 2 :(得分:1)
您必须使用一个过滤器。但是您可以使用过滤器参数使其具有动态性和可重用性。
Route::filter('role', function($route, $request, $value){
$allowedRoles = explode(';', $value);
$user = Auth::user();
if(in_array('Admin', $alloweRoles) && $user->Admin()){
return;
}
else if(in_array('SuperAdmin', $allowedRoles) && $user->SuperAdmin()){
return;
}
return Response::json(array('flash' => 'You are not authorized.'), 401);
});
你这样使用它:
Route::group(array('before' => array('auth|role:Admin;SuperAdmin')), function(){
Route::get('/report/{id}','ReportCntrl@getreport');
}
Laravel会自动按顺序传递三个过滤器参数($route, $request, $value
)。第三个参数$value
包含:
之后传递的所有内容。 Laravel docs
$request
是当前请求对象(Illuminate\Http\Request
的实例)和$route
当前路由对象(lluminate\Routing\Route
的实例)