【问题标题】:Is it possible to authenticate users through different subdomains?是否可以通过不同的子域对用户进行身份验证?
【发布时间】:2021-12-20 22:14:50
【问题描述】:

我想为客户创建一个多租户 laravel 8.0 应用程序(带有 laravel multi-tenancy packagelaravel sanctum),为客户使用 Vue 前端,为管理员创建一个 Vue 前端。

(Vue2) 客户前端,例如:example.comstore1.example.comstore2。 example.com

(Vue2) 管理员前端,例如:store1.admin.example.comstore2.example.com

(Laravel) 后端 用于其余 api,例如:store1.api.example.comstore2.api.example.com

我想让客户能够登录任何子域,例如 example.comstore1.example.com 同时登录所有其他子域。

有可能吗? 您有什么建议吗?

+1 问题:有没有办法用 laravel 生成子域?

这将是我的第一个多租户沙盒应用程序,感谢您的帮助!

【问题讨论】:

    标签: laravel vue.js authentication multi-tenant


    【解决方案1】:

    虽然我还没有进入更深的子域,但我已经对此进行了类似的设置。

    您需要做的第一件事是为您的应用程序配置 tld 和通配符子域,因此无论您点击什么子域,您都应该始终看到索引内容。

    为此的第一个设置是将 laravel 中的 SESSION_DOMAIN 设置为 .env 类似 .whatever.com 例如

    SESSION_DOMAIN=.whatever.com
    

    接下来你要做的就是确保你的应用使用 JWT Authentication https://github.com/tymondesigns/jwt-auth

    当您在用户浏览器上保存令牌时,您需要将域设置为与您的SESSION_DOMAIN 相同。

    无论他们尝试登录哪个子域,我都会获取 tld

    const tld = (() => {
      const host = window.location.host, subs = host.split('.')
      if ( subs.length > 2 ) 
        return host.replace(/^[^.]+\./g, "")
      return host
    })()
    

    然后我在包含令牌的域 cookie 上的 tld 前面添加了 .

    Cookies.set('token', token, { expires: remember ? 365 : null,  domain: `.${tld}` })
    

    因此,如果您从开发工具栏转到“应用程序”选项卡,然后在您的应用程序的 cookie 下,域应该是 .whatever.com,如果您从一个子域跳转到另一个子域,您仍然应该通过身份验证

    另外,关于您的设置,我认为您只是在初始计划中过度使用子域。

    您只需为 STORE 创建一个包含所有不同商店的表,然后为slug 添加一列。然后只需为其他东西创建一对多或多对多关系,例如用户表中的商店所有者,产品表中的存储产品等,因此您的存储表应该看起来像

    id |    name  | slug
     1 | My Store | store1
    

    然后在前端,您将获取子域的 slug 并请求与您的 API 端点匹配的存储 slug 的查询,您的端点只需要一个结构,您不需要'不需要让每个商店都有自己的 api 端点,你只需要在每次点击你的端点时都包含 store slug 这是商店特定的请求,所以如果你点击 store1.whatever.com,你的所有查询应该使用 slug store1 拉取与商店相关的所有内容@

    另外,你不需要为 admin 和 api 端点使用子域,尝试寻找一个 Vue+Laravel 模板,如下面的这个,它有很多功能,如 vue 路由、vuex 和模板我认为非常适合您的设置https://github.com/cretueusebiu/laravel-vue-spa

    那么你应该以这样的方式处理它要好得多

    前端 -> store1.whatever.com

    管理员 -> store1.whatever.com/admin/

    API 端点 -> whatever.com/api/

    【讨论】:

    • 感谢您的帮助!项目还处于规划阶段,但你的想法是最接近最终计划的,你帮了大忙。重要的是让所有商店都可以从他们的子域名访问,比如 store1.example.com,而客户在商店之间导航后不必一次又一次地登录。没有 api 和管理前端的子域是一个非常酷的想法。有时,当它对我来说是新的或复杂的事情时,我会有点过度设计事物。 :) 是必须使用 JWT 还是可以使用 Latavel Sanctum (laravel.com/docs/8.x/sanctum)
    • 还有一个更重要的问题。商店应该存储在名称域等数据库中。当我创建一个新商店时,我唯一必须创建的是一个新的子域,对吗?不是为每个商店部署新的前端应用程序吗?
    • 我对 sanctum 不是很熟悉,因为我只使用 JWT 将近十年了。但是不管你用什么认证方式,思路应该还是和我上面说的一样。至于您的商店设置,我提到使用 vue TEMPLATING 结构来处理不同的商店、结帐和玩我参考的 laravel-vue-spa,这应该可以帮助您入门,它默认使用 JWT,但您可以替换为如果您愿意,可以与圣所
    • 顺便说一下,正如我提到的,您不需要为每个商店创建一个子域,只需配置通配符子并将其指向您的应用程序,所以如果您点击store1.whatever.com您应该做的第一个查询是检查您的商店表上是否存在 sub,否则只需处理重定向或您的 vue 内部的东西来处理来自不存在的商店sub的请求
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多