当前位置: 首页 > 知识库问答 >
问题:

使用一个表进行多重身份验证Laravel 5.4

林星阑
2023-03-14

我想使用多身份验证Laravel,但只有一个表"用户"

我如何实现这一点?

共有1个答案

孟楷
2023-03-14

正确的做法是为每种需要身份验证的用户类型分别提供驱动程序和模型。您可以阅读此帖子,并了解更多信息。话虽如此,如果您想要快速但不那么安全和可扩展的东西,可以执行以下操作:

您可以在用户迁移中设置一个标志,用于确定用户类型,如下所示:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->unsignedInteger('user_type');
            $table->rememberToken();
            $table->timestamps();
        });
    }

对于这个例子,我们将有一个常规用户作为类型1,一个管理员作为类型2。

然后,您可以创建一个中间件,每当您的常规用户编程逻辑与管理员的不同时,该中间件都会检查用户是否具有所需的'user\u type'标志。您还可以检查特定控制器的实例化。

在本例中,我们将创建两个中间件,一个用于普通用户,另一个用于管理员。这将通过使用我们在迁移中定义的属性User\u type再次保护具有不同用户类型的相同User驱动程序/模型访问彼此的资源。

创建两个中间件:

php artisan make:中间件用户中间件

php artisan make: middleware AdminMiddleware

我们在Kernel.php中注册它们。应该是这样的:

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,
        'user' => \App\Http\Middleware\UserMiddleware::class,
        'admin' => \App\Http\Middleware\AdminMiddleware::class
    ];

在内核中注册中间件后,我们将修改它们的handle()方法以满足我们的需要:

UserMiddleware.php

public function handle($request, Closure $next)
    {
        if(Auth::user()->user_type == 1)
            return $next($request);
        return redirect('/');
    }

AdminMiddleware.php

public function handle($request, Closure $next)
    {
        if(Auth::user()->user_type == 2)
            return $next($request);
        return redirect('/');
    }

Auth::user()Facade将在这两种情况下返回登录用户的实例,然后我们检查它是1还是2。如果它们匹配相应的值,我们将继续到我们打算去的任何地方,否则,我们可以重定向到应用程序中的其他位置,例如,主路由/

在此之后,我们可以使用全新的中间件继续保护路由或控制器。

例如,如果您希望使路由仅对管理员可用,而不对普通用户可用,则可以执行以下操作:

routes/web.php

Route::get('/admin', function () {
    return view('admin');
})->middleware('admin');

然后,该特定路由将被保护到属性User\u type设置为2时创建的Users。

我希望这对你有点帮助。

干杯!

 类似资料:
  • 我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 问题内容: 我可以通过接收到请求的xml 但不是 没有JavaScript错误,没有跨域策略问题。可能是语法错误,但是我找不到合适的教程。有什么建议吗? 问题答案: 我认为您需要纯格式:

  • 问题内容: 我需要使用PostForm方法将代理与auth一起使用。如果我使用类似(简体)的内容: 我可以轻松做到,并且效果很好。但是现在,我正在编辑第三方程序包,并尝试将代理添加到现有代码中: 在我看来,它是行不通的,而且失败了。在此示例中,没有身份验证的代理可以正常工作。有人知道吗,在这种情况下我可以在auth中使用代理吗? 问题答案: 您正在尝试向响应中添加标头,这不是您发送到服务器的内容,

  • 问题内容: 我想使用mongoengine db在Django项目中处理身份验证。 我尝试了一些有关此问题的示例,这些问题已在旧问题中得到解答,但并未运行。我正在使用Django 1.6和mongoengine。一切都已安装,运行,并且我可以创建文档并将其保存到Mongoengine DB。 我正在追踪http://mongoengine- odm.readthedocs.org/en/lates