【问题标题】:Laravel subdomain: single auth across all subs not working?Laravel 子域:所有子域的单一身份验证不起作用?
【发布时间】:2020-09-28 17:23:48
【问题描述】:

我正在构建一个带有动态子域系统的站点,例如 (name.domain.com)。我正在使用带有 laravel 的 serve 命令的 Ubuntu。

我已经在我的路线中设置了所有这些:

Route::domain('{x}.localhost')->group(function (){
    Route::get('/url/',  'SomeController@someAction')->middleware('can:xyz,x')->name('someName');
});

现在,一切都很好,除了 Auth 被子域锁定

eg(xyz.localhost:8000/ , localhost:8000/) 需要单独登录。

经过一番谷歌搜索后,我可以在“域”下的 config/session.php 文件中覆盖它。因此,在我的 .env 文件中,我为 SESSION_DOMAIN 设置了一个新变量,并将其指向“.localhost”或“.localhost:800”,或者只是为了测试我得到与建议的 IP 127.0.0.1 / :8000 相同的结果,但是当我尝试登录我的会话在登录后立即无效,例如(我登录并被重定向到正确的路线,但我的身份验证发现我没有登录)

会话配置

'domain' => env('SESSION_DOMAIN', null),

我的 .env

SESSION_DOMAIN=.localhost

似乎由于某种原因没有设置 cookie?

应该注意这是同时使用文件和数据库进行会话的情况,我还每次都清除了我的缓存和会话存储以及 cookie 等。

-- 在过去的几天里,我已经尝试了所有我能想到的方法来解决这个问题,但没有成功。即使在全新安装的 laravel 上也存在同样的问题。

我可以在主 URL 上使用 FF 登录,但在子 URL 上我没有登录,如果我尝试会得到 419。

有什么建议吗?亲切的问候,马特

-编辑

要在新安装的 laravel 上重现,首先,安装 auth 包:

composer require laravel/ui

php artisan ui vue --auth
npm run dev

接下来,用你的 Mysql 数据库信息编辑你的 .env 文件,并将这一行添加到文件中:

SESSION_DOMAIN=.localhost

最后将它添加到你的 web.php 路由文件中。

Route::domain('{foobar}.localhost')->group(function (){
    Route::get('/test/',  'HomeController@index');
});

(我喜欢在这里在命令行中创建一个帐户) 然后推送默认迁移并通过登录主页和任何子域来运行服务器和测试。

【问题讨论】:

标签: php laravel authentication session subdomain


【解决方案1】:

因为是 localhost 域,而是使用虚拟域,例如 something.test,然后设置 SESSION_DOMAIN=.something.test 并清除缓存。 localhost 和 127.0.0.1 不是同一来源,因此无法设置会话。

【讨论】:

  • 您好 TEFO,感谢您的回复。请您详细说明一下好吗?我不确定我是否在关注你。当我测试时,我只使用 localhost,127.0.0.1 只是尝试看看它是否可以工作。我试图在我的主机文件中设置一个主机并将其指向 127.0.0.1:8000 但我遇到了同样的问题。亲切的问候。
  • 对于设置会话(cookies),您需要确切的 url 来源,这意味着您不会访问在 127.0.0.1:8000 中设置在 localhost:8000 上的 cookie,并且对于 localhost 和 localhost:8000 也是如此。例如检查你机器上的 localhost 它可能是不同的项目。
  • 嗨 TEFO,我很抱歉,我不确定我是否只是疯狂地不关注你,或者你误解了我的问题。如果是我自己的愚蠢,我很抱歉。我只为该站点使用一个域,我没有尝试通过不同的顶级域(例如 localhost:8000 和 127.0.01:8000)访问该站点,而是尝试仅通过 localhost:8000 等动态子域访问该站点,测试。本地主机:8000,foobar.localhost:8000。我将编辑我的原始帖子以获取重现步骤。
  • @Makka 在您的主机文件中,添加127.0.0.1 something.test127.0.0.1 foo.something.test,不要指定端口。然后按照@TEFO 所说设置SESSION_DOMAIN=.something.test,会话将在http://something.test:8000http://foo.something.test:8000 上持续存在
【解决方案2】:

供您参考,有一个 cookie 和会话存储来持久化会话,laravel 还支持在数据库中持久化会话。会话 cookie 具有可访问的域,因此您需要配置 session.php 文件以采用子域。单一身份验证不适用于您的所有子域,因为您没有很好地配置它。这是你可以做到的。

您需要更新会话配置以在包括子域在内的域范围内保持会话。请按照以下步骤操作。

  1. 首先设置要在应用程序中使用的虚拟主机。然后,您也可以将虚拟主机用于子域。现在您使用的是localhost,它根本不是域。它是 TCP/IP 模型中的环回地址。请参阅rfc2606 定义。

  2. 转到 config/session.php 并将前缀为 .domain 更新为 config => '.your-domain.com'.

  3. 然后清除您的应用程序缓存,打开 Chrome DevTool 并转到 应用程序 > 应用程序 > 清除存储。您还需要清除以前的 cookies

  4. 运行 artisan 命令 php artisan config:cachephp artisan config:clear 以删除之前缓存的 laravel 应用程序配置。

如果您使用 database 作为会话驱动程序,您需要为此创建一个会话表。运行命令php artisan session:table生成会话表迁移,然后使用php artisan migrate进行迁移。然后执行上面给出的四个步骤。你可以参考我类似的回答,逻辑上和你关注的一样Here

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多