Laravel 跨域认证 cookies 和过滤器

6

我有一个 Laravel 网络服务器,它管理着多个域名,例如:

site1.domain.com, site2.domain.com, site3.domain.com

我已经成功地将站点名称添加到用户认证过程中,因此每个站点都有一个单独的用户表。不同站点之间的用户没有持久性,被视为独立的。这种方式运行良好。

对于每个站点,都有一个后端,例如:

site1.domain.com/office

为此,我有一个不同的模型管理员用户组。为了使这个工作起来,我拥有完全不同的认证路径、不同的控制器等。我通过以下过滤器实现这一点。
App::before(function($request)
{
  if ($request->is('office*'))
  {
    Config::set('auth.driver', 'eloquent.admin');
    Config::set('auth.model', 'Admin');

这些管理员在不同域中是通用的。也就是说,用户名在管理员模型内是唯一的。

这个方式很好用,但需要更新一下。

我希望登录和注销在不同网站之间保持一致。也就是说,如果管理员已经登录了一个网站的管理办公室,他们已经登录了所有网站的管理办公室,并且如果他们注销,他们已经从所有网站注销了。

我尝试更新我的筛选器:

App::before(function($request)
{
  if ($request->is('office*'))
  {
    Config::set('auth.driver', 'eloquent.admin');
    Config::set('auth.model', 'Admin');

    Config::set('session.path', '/office');
    Config::set('session.domain', '.domain.com'); // tried without leading . too
  }
});

然而,如果我在浏览器中分析我的cookie,则域和路径信息未受影响,并保持为site.domain.com和/。 请问您能告诉我如何根据我的请求更改会话cookie属性吗?
这涉及到网站的依赖关系。在管理员和站点之间存在多对多的关系,该关系确定了管理员是否可以访问特定站点的/office。
我担心如果管理员已登录,则他们将获得任何站点办公室访问权限。
我的意图是编写一个额外的过滤器“可以管理此站点”,以检查此关系。您认为在提议的管理员跨域身份验证的背景下,这是一项合适的措施吗?

如果您不介意所有用户在站点之间共享,您可以将cookie域更改为.domain.com。 另一个选项是创建新的身份验证guard/model,生成/检查单独的JWT cookie。 - Sigismund
1个回答

0
如果你打开了app/config/session.php文件,你使用的是哪个驱动程序?有些驱动程序(例如文件)似乎无法在通配符子域之间存储数据。
我通过使用Redis解决了这个问题(如果你使用Homestead,则应该已经可用):
'driver' => 'redis',

    'redis' => array(

    'cluster' => true,

    'default' => array(
        'host'     => '127.0.0.1',
        'port'     => 6379,
        'database' => 0,
    ),

),

这与不同的驱动程序如何使用主机名引用会话数据有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接