两个用户在laravel 5.2的单个表中进行身份验证

时间:2016-07-04 03:00:28

标签: laravel authentication middleware

我正在尝试使用laravel框架构建在线商店网站

我有一个包含这些列的表:id, username, password, division_id

其中division_id引用名为division的表格,其中包含:id, division_type

我有两个division typeAdminCustomers

我试图根据他们的division_id划分访问特定页数的权限,例如管理员可以访问管理员面板而不是客户,客户可以访问客户面板,例如产品订购页面但不是管理员。

两种类型都可以在其可访问页面中执行几乎所有操作,并且我的主页面将具有管理面板,客户面板和主网站。

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

P.S。我是这个论坛的新手

1 个答案:

答案 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!');