我正在构建一个多租户Laravel应用程序,其中每个租户都有自己的数据库(包括用户表)。
承租人由TenantServiceProvider中的子域标识,并且在确定承租人ID时,将连接更改为使用适当的数据库。
一切正常,但是我遇到了一个重大的安全问题。
我以ID为1的用户“ John Doe”的身份登录tenant1.mysite.com
我将URL更改为tenant2.mysite.com,现在我以“ Jane Doe”的身份登录,他在tenant2网站上的ID为1。
如何防止John Doe的会话在其他租户的站点上使用?
答案 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
。