2016-07-04 68 views
0

我试图建立一个网上商店网站使用laravel框架两个用户身份验证在一个表中laravel 5.2

我有这些列的表:id, username, password, division_id

其中division_id指称为表division有:id, division_type

和我有两个division typeAdminCustomers

我试图根据访问权限访问一定数量的页面,例如管理员可以访问管理员面板但不访问客户,客户可以访问客户面板,例如产品订单页面,但不访问管理员。

这两种类型都可以在他们可访问的页面中做几乎所有的事情,而我的主页将有一个管理面板,一个客户面板和主网站。

我该如何在我的项目中只使用一个表和中间件组?

P.S.我是新来的这个论坛

+0

什么是关系情景? 1个用户只属于一个分区?或1个用户属于多少? –

+0

一个用户属于一个部门,一个部门拥有多个用户。 – Orange

+0

正确的方法应该有两个中间件集团路线,为管理员和客户 – xmhafiz

回答

0

对于这个中间件,你只需要检查division查看站点所需要的是否与用户所属的division相同。在handle功能,你可以通过它表示一个部门名称的第三个参数,如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}', '[email protected]')->middleware(['division:customer']); 

在你handle功能,您可以访问该值作为第三个参数:

public function handle($request, Closure $next, Division $division) 

要通过主键以外的其他方式自动解决依赖关系的过程,我们将继续并打开我们的App\Providers\RouteServiceProvider并在boot函数中添加一些魔力。现在

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; 
     }); 
    }); 

,回中间件,我们可以很容易地针对我们的handle功能$division,我们authorized用户的比较。

if(app()->user()->division->type == $division->type) { 
    return $next($request); 
} 

abort(403, 'You are not authorized to view this page!'); 
+0

我们如何把'中间件'=> ['division:customer']'? 你能告诉我在routes.php中这个实现的例子吗? – Orange

+0

@Orange你可以将它应用到你的'Routes'。很可能你想要一个组。答案已更新。 – Ohgodwhy

+0

找不到路线。有人可能会将'division'参数传递给原来的'auth'中间件而不创建新的中间件? – Orange