Laravel:多种用户

时间:2017-03-27 18:25:37

标签: php laravel scalability laravel-5.4

我正在开发一个应用程序,其中我有三种类型的用户(真实场景),该应用程序有三个区域自由职业者和Lms(学习管理系统)和管理面板两者:

  • Admins =>管理面板的用户,其中包含所有统计数据/数据。
  • 自由职业者部分:自由职业者部分登录/注册
  • Lms部分=>学习管理系统部分的用户登录/注册

目前我没有使用任何类型的多身份验证功能,每当我在自由职业者部分登录用户并进入lms部分时,经过身份验证的用户就可以使用。

因为我只为一个用户使用了一个表格,其中我有一个列userType(未使用但未来有证据)。

我知道像this one这样的几个软件包。我可以实现,但我没有想到可能有更好的方式,stackoverflow社区可以提供一个。

我的问题是如何处理这种情况,这是最有效和最有效的方式。

3 个答案:

答案 0 :(得分:1)

最有效和最健壮的方法是使用简单的user_type列来存储用户类型并创建一些帮助程序。例如,要检查用户是否为管理员,您可以在User模型中创建类似的内容:

public function isAdmin()
{
    return auth()->check() && auth()->user()->user_type === 3;
}

这是最简单的方法,具有很多优点。对于使用大量关系的应用程序来说,它有利于速度等。

答案 1 :(得分:1)

这可能不是您正在寻找的多方面,而是某些网页的权限。看看:row numbers

它非常简单明了。它甚至可以让你挑出用户,例如两者都有管理员级别,但只有一个人可以查看它。

答案 2 :(得分:1)

我就是这样做的。

我将跳过有关设置auth控制器和视图的详细信息。他们使用工匠控制台非常直接的脚手架。

我们需要的第一件事是Users表上的新字段。如果您只有两个级别(管理员和非管理员),则为admin字段。您的案例中的ENUM值。

取决于您希望授予(或不授予)对某些部分/页面/资源等的访问权限。

工匠控制台生成所有必要的页面,中间件,基本登录路线。但是在完成之后,您将需要第二个中间件来检查不同级别的访问。让我们称之为CheckAdmin

  1. 使用以下命令 php artisan make:middleware CheckAdmin。这将在app\Http\Middleware

  2. 中创建一个具有指定名称的新中间件
  3. 现在在Kernel.php(最后一行代码)中注册中间件。这为中间件类提供了我们刚创建的名称(在本例中为admin)。

    protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'admin' => \App\Http\Middleware\CheckAdmin::class,
    ];
    
  4. 检查某些管理员权限的所有路由都应使用我们刚刚在laravel提供的admin工厂中间件之后注册的auth中间件。根据您构建应用/网站的方式,有两种方法。

  5. 一个。不使用资源控制器进行路由。

    转到您的路线web.php文件。并为请求注册authadmin中间件。下面是一个例子。

    Route::get('/example-admin-only-route', function () { //SOME LOGIC 
    })->middleware('auth', 'admin');
    

    B中。使用资源控制器。 (你可能应该随时使用)

    在资源控制器的构造函数中。我们的示例资源ExampleController.php

    class ExampleController extends Controller
    {
    
    public function __construct()
    {
      $this->middleware('auth');
      $this->middleware('admin');
    }
    
    ...
    }
    
    1. 为您的CheckAdmin中间件编写逻辑。

      namespace App\Http\Middleware;
      
      use Closure;
      
      class CheckAdmin
      {
       /**
       * Handle an incoming request.
       *
       * @param  \Illuminate\Http\Request  $request
       * @param  \Closure  $next
       * @return mixed
       */
      
       public function handle($request, Closure $next)
       {
          if($request->user()->admin == 'Admin') //or FreeLancers or LMS (or maybe Unicorns)
          {
            return $next($request);
          }
          else
          {
            return redirect("/not-worthy");
          }
      
        }
      }
      
    2. 代码检查管理员权限,并让请求通过或执行其他操作。在我们的案例中,重定向到不同的终点。但是你可能希望用它做更有创意的事情。

      干杯。