如何在多租户laravel应用程序中锁定租户用户之间的访问

时间:2020-04-26 17:21:43

标签: php laravel

我正在构建一个多租户Laravel应用程序,其中每个租户都有自己的数据库(包括用户表)。

承租人由TenantServiceProvider中的子域标识,并且在确定承租人ID时,将连接更改为使用适当的数据库。

一切正常,但是我遇到了一个重大的安全问题。

我以ID为1的用户“ John Doe”的身份登录tenant1.mysite.com

我将URL更改为tenant2.mysite.com,现在我以“ Jane Doe”的身份登录,他在tenant2网站上的ID为1。

如何防止John Doe的会话在其他租户的站点上使用?

1 个答案:

答案 0 :(得分:1)

一种实现方式;在您的Authenticate中间件中放置一个块,例如;

用户成功登录后,将tenant1值放在用户会话中的指定键中。

Session::put('domain', 'tenant1');

在同一中间件中的

即使身份验证正确,也请检查用户的会话是否与子域名匹配。如果它们匹配,则继续用户,否则将其重定向到登录页面。

Session::get('domain') === $this->getSubDomain($request)

public function getSubDomain(Request $request): string
{
    $urlSegments = explode('.', parse_url($request->url(), PHP_URL_HOST));

    return $urlSegments[0]; // this will return "tenant1"
}

请不要忘记在用户注销后从会话中删除domain