我正在尝试使用laravel框架构建在线商店网站
我有一个包含这些列的表:id, username, password, division_id
其中division_id
引用名为division
的表格,其中包含:id, division_type
我有两个division type
:Admin
和Customers
我试图根据他们的division_id
划分访问特定页数的权限,例如管理员可以访问管理员面板而不是客户,客户可以访问客户面板,例如产品订购页面但不是管理员。
两种类型都可以在其可访问页面中执行几乎所有操作,并且我的主页面将具有管理面板,客户面板和主网站。
如何在我的项目中只使用一个表和中间件组?
P.S。我是这个论坛的新手
答案 0 :(得分:0)
对于此中间件,您只需要检查查看该网站所需的division
是否与该用户所属的division
相同。在handle
函数中,您可以传递表示分部名称的第3个参数,例如customer
当您将中间件添加到路由中时,您可以将分区的名称作为参数传递给handle
函数,如下所示:
'middleware' => ['division:customer']
在Route Group
中实现此功能可能如下所示:
Route::group(['prefix' => 'customer', 'middleware' => ['division:customer']], funtion(){
//route definitions for all these routes will require a "division" type of "customer"
});
或者您可以将其应用于路由RESTful
路由的资源:
Route::resource('customer', 'CustomerController')->middleware(['divison:customer']);
或者您可以将其应用于特定路线:
Route::get('customer/{id}', 'CustomerController@show')->middleware(['division:customer']);
在handle
函数中,您可以将该值作为第三个参数访问:
public function handle($request, Closure $next, Division $division)
为了通过主键之外的其他方式自动解决依赖关系的过程很简单,我们将继续弹出我们的App\Providers\RouteServiceProvider
并在boot
函数中添加一些魔法。< / p>
public function boot(Router $router)
{
parent::boot($router);
$router->bind('division', function($value) {
return Division::where(function($query) use($value){
if (is_int($value)) {
return $query->where('id', $value)->first();
} else {
return $query->where('type', ucfirst($value))->first();
}
return null;
});
});
现在,回到中间件,我们可以轻松地与$division
函数中的handle
和我们的authorized
用户进行比较。
if(app()->user()->division->type == $division->type) {
return $next($request);
}
abort(403, 'You are not authorized to view this page!');