【发布时间】:2016-03-10 23:46:56
【问题描述】:
我正在尝试在 Laravel 5.1 中制作应用程序。
在我的用户表中,我有 3 种类型的用户,管理员、代理和农民。在 users 表中有一个名为 user_type_id 的列,其中 admin 是 user_type_id=1,agent 是 user_type_id=2,farmer 是 user_type_id=3。
管理员有权执行代理几乎没有权限的所有操作。
问题是在使用中间件时,我的 Authenticate.php 和 AgentAuthenticate.php 中间件文件表现得好像它们是一样的,这意味着代理正在获得所有管理员的权力。有什么逻辑错误吗?这是代码。
agentAuthenticate.php(中间件)
public function handle($request, Closure $next)
{
if ($this->auth->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('auth/login');
}
}
if(! $this->auth->user()->user_type != 2) {
return redirect()->guest('auth/login');
}
return $next($request);
}
验证.php
public function handle($request, Closure $next)
{
if ($this->auth->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('auth/login');
}
}
if(! $this->auth->user()->user_type != 1) {
return redirect()->guest('auth/login');
}
return $next($request);
}
routes.php
//guest routes
Route::resource('/farmerPoint','farmerPointController',['only' => ['index', 'show']]);
Route::resource('/crop','cropController',['only' => ['index', 'show']]);
//Admin routes
Route::group(['middleware' => 'auth'], function () {
Route::resource('agent','agentController');
Route::resource('farmer','farmerController');
Route::resource('farmer.crop','farmerCropController');
Route::resource('cropType','cropTypeController');
Route::resource('crop','cropController',['except' => ['index','show']]);
Route::resource('farmerPoint','farmerPointController',['except' => ['index','show']]);
Route::get('/AdminPanel',function(){
return view('frontend.AdminPanel');
});
});
//agent routes
Route::group(['middleware' => 'agent'], function () {
Route::resource('farmer','farmerController');
Route::resource('farmer.crop','farmerCropController');
Route::resource('agent','agentController',['only' => ['index','show']]);
Route::get('/AgentPanel',function(){
return view('frontend.AgentPanel');
});
});
【问题讨论】:
-
等一下,
Authenticate.php是 laravel 自带的吗(/app/Http/Middleware/Authenticate.php)?如果是这样,是的,它的行为方式就像该控制器实际用于身份验证一样。它还实现了use Illuminate\Contracts\Auth\Guard;,所以我只能建议您的管理员使用不同的中间件(就像您的agent),使用Authenticate.php作为主要的身份验证中间件。因此,为了保护您的路线,您必须用至少两个Route::group包围路线 - 一个用于身份验证,另一个用于隔离/角色。
标签: php laravel authentication laravel-5.1 laravel-middleware