laravel 5.2 中的单个 table 中的两个用户身份验证

two users auth in a single table in laravel 5.2

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

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

其中 division_id 指的是一个名为 division 的 table,其中:id, division_type

我有两个 division typeAdminCustomers

我正在尝试根据他们的 division_id 来划分访问一定数量页面的权限,例如管理员可以访问管理面板但不能访问客户,客户可以访问客户面板,例如产品订单页面但不是管理员。

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

如何在我的项目中只使用一个 table 和中间件组来做到这一点?

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

对于这个中间件,您只需要检查查看站点所需的 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}', 'CustomerController@show')->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!');