【问题标题】:two users auth in a single table in laravel 5.2laravel 5.2 中的单个表中的两个用户身份验证
【发布时间】:2016-07-04 03:00:27
【问题描述】:

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

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

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

我有两个 division typeAdminCustomers

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

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

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

附:我是这个论坛的新手

【问题讨论】:

  • 关系的场景是什么? 1 个用户只属于一个部门?还是 1 个用户属于多个?
  • 一个用户属于一个部门,一个部门有多个用户。
  • 正确的方式应该有两个组路由中间件,管理员和客户
  • 我不太确定如何拥有多个团体路线,你能举个例子告诉我如何吗?

标签: laravel authentication middleware


【解决方案1】:

对于这个中间件,您只需要检查查看站点所需的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 函数中的 $divisionauthorized 用户进行比较。

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

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

【讨论】:

  • 我们如何输入'middleware' => ['division:customer']?你能在 routes.php 中给我看一个这个实现的例子吗?
  • @Orange 您可以将此应用到您的Routes。很可能你想要一个小组。答案已更新。
  • 找不到路线。是否可以将division 参数传递给原来的auth 中间件而不创建新的中间件?
  • @Orange 什么route 没有找到?当然,您可以根据需要扩展中间件并将其传递给自己。
  • 哦,我的错。那是语法错误大声笑。有效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
相关资源
最近更新 更多