【问题标题】:How to make custom authentication on Laravel?如何在 Laravel 上进行自定义身份验证?
【发布时间】:2019-09-05 15:03:41
【问题描述】:

我有一个带有登录表单的 Laravel 应用程序。我正在使用子域,例如:{{business_subdomain}}.laravel.test。我的应用程序的目的是在我的数据库中创建公司,并让注册用户登录他们附属的公司和特定域。

所以在我的 web.php 中我声明了以下内容:

Route::domain('{business_subdomain}.' . env('APP_URL'))->middleware(['business.subdomain'])->group(function ()

我的数据库包含以下表格:
* 像用户这样的标准表
* 包含 id、name 和 subdomain 的企业
* Business_user 包含 business_id 和 user_id

business_id(business_user表)与id(business表)有关系
user_id(business_user表)和id(users表)有关系

我创建了一个检查以下内容的中间件:

$business = $request->user()->businesses->where('subdomain', $request->route('business_subdomain'))->first();

所以子域值(业务表)必须等于URL/路由子域值,否则登录时会出现403页面。

所以我想要实现的是:当用户拥有一个帐户,但没有附加到正确公司/企业时,我想显示标准身份验证错误: 这些凭据与我们的记录不符。

我尝试在 LoginController 上的中间件中使用代码并分别覆盖几乎每个函数,但没有成功。

我是否需要重写 Laravel 身份验证功能,是否需要创建另一个中间件或使用 Guards?

laravel 身份验证登录顺序(应用程序用于登录用户的顺序)对我来说似乎很混乱。

也许有人可以向我提供更多信息或帮助我!

我尝试在 LoginController 上的中间件中使用代码并分别覆盖几乎每个函数,但它不起作用。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    听起来您可能正在寻找多租户。有几个不同的包可用,用于单数据库和多数据库设置。

    这里是 some very informative slides on the topic,特定于 Laravel。 an excellent article 了解更多详情。

    我们有一个类似的应用程序,使用torzer/awesome-landlord 进行子域路由。租户包确保登录只会搜索正确租户的用户。

    为了设置正确的租户,我们添加了一个中间件(App 是租户,在您的情况下是 Business):

        public function handle($request, Closure $next)
        {
            $subdomain = $this->getSubdomain($request->server('HTTP_HOST'));
    
            if ($subdomain) {
                $app = App::getBySlug($subdomain);
    
                abort_if(!$app, 404);
    
                $this->tenantManager->addTenant($app);
            } else {
                // empty or generic subdomain
                // this is OK as long as there is no user
    
                if ($user = $request->user()) {
                    return $this->redirectToUserAppSubdomain($request, $user);
                }
            }
    
            return $next($request);
        }
    

    【讨论】:

    • 感谢您提供非常有帮助的回答!但是我需要在哪条路由上提供这个中间件,当我尝试使用不在域公司中的帐户登录时,如何在登录表单上显示错误?提前谢谢!
    • 中间件必须在所有个请求上运行。该包将WHERE business_id = CURRENT_BUSINESSCURRENT_BUSINESSaddTenant() 定义)附加到属于租户(例如用户)的模型的每个选择查询。所以登录表单将自动只寻找匹配电子邮件的用户在当前应用程序中,如果输入的电子邮件在错误的子域中,它将失败,并显示 Laravel 的默认“未找到用户”错误。希望这很清楚。
    猜你喜欢
    • 2017-07-27
    • 2020-04-24
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多