php - 拉拉维尔 : Multiple type users

标签 php laravel scalability laravel-5.4

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

  • 管理员 => 管理面板的用户,所有统计数据/数据都在那里。
  • 自由职业者部分:自由职业者部分登录/注册
  • Lms 部分 => 学习管理系统部分的用户登录/注册

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

因为我只为用户使用一张表,其中有一列userType(该列未使用,但用于将来校对)。

我知道几个包,例如 this one 。我可以实现,但我还没有,并且认为可能有更好的方法,stackoverflow 社区可以提供一个。

我的问题是如何处理这种情况,什么是最有效和最稳健的方法。

最佳答案

我就是这样做的。

我将跳过有关设置身份验证 Controller 和 View 的详细信息。使用 artisan 控制台,他们可以非常直接地搭建脚手架。

我们首先需要的是您的Users 表中的新字段。如果您只有两个级别(管理员和非管理员),则需要一个admin 字段。您的情况中的 ENUM 值。

根据该字段中的值,您想要授予(或不授予)对某些部分/页面/资源等的访问权限。

Artisan 控制台生成基本登录所需的所有页面、中间件、路由。但完成此操作后,您将需要第二个中间件来检查不同级别的访问权限。我们称之为 CheckAdmin

  1. 使用以下命令 php artisan make:中间件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 提供的 auth 工厂中间件之后注册的 admin 中间件。有两种方法可以实现此目的,具体取决于您构建应用程序/网站的方式。

A.不使用路由资源 Controller 。

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

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

B.使用资源 Controller 。 (只要有可能,您可能就应该这么做)

在资源 Controller 的构造函数中。 ExampleController.php 用于我们的示例资源。

class ExampleController extends Controller
{

public function __construct()
{
  $this->middleware('auth');
  $this->middleware('admin');
}

...
}
  • 为您的 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");
        }
    
      }
    }
    
  • 代码会检查管理员权限,然后要么让请求通过,要么对其执行其他操作。在我们的例子中,重定向到不同的端点。但您可能希望用它做更多有创意的事情。

    干杯。

    关于php - 拉拉维尔 : Multiple type users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053834/

    相关文章:

    database - 你怎么不加入?

    php - 我错过了面向对象编程的重点吗?

    php - 在 DB_Connector 类中的何处放置 PDO 准备好的语句 - 在构造函数中还是在函数中?

    php - Laravel 单元测试,如何软删除 "seeInDatabase"行?

    php - 将多个用户分配给 'task'

    java - Jersey webservice 可扩展的下载文件和回复客户端的方法

    PHP (OOP) - 从调用的函数中获取对象

    php - 在html中附加标题标签

    javascript - 从 laravel 中的 javascript 调用详细信息

    database-design - NoSQL 或关系型或两者兼而有之