对多个用户表进行身份验证

Posted

技术标签:

【中文标题】对多个用户表进行身份验证【英文标题】:Auth for multiple users tables 【发布时间】:2018-05-10 14:12:12 【问题描述】:

我对 Laravel 身份验证模块有疑问。

我正在将旧工具重写为 laravel,但必须保留旧的系统数据库结构。

系统使用多个数据库(每个部门分开)并识别 url 应该使用哪个数据库,例如。

www.example.com/foo    //use foo DB for foo department
www.example.com/bar    //use bar DB for bar department

Foo 和 Bar DB 有自己的 users 表。两个数据库中都存在一些帐户但ID不同,用户名相同。示例:

//foo DB users table
ID   username
1    xyz
2    abc

//bar DB users table
ID   username
1    qwe
2    xyz

假设我使用 foo deparment(和 DB)作为用户 xyz(id 1)登录到系统。

我现在要转到酒吧部门(和酒吧数据库)。

因此,我以用户 qwe 的身份登录酒吧部门(和 DB),因为系统一直使用我登录系统的 id (1)。

如何改变这种行为并强制系统使用用户名而不是 id 作为在数据库中识别用户的关键?

我知道我可以在用户模型中使用用户名作为主键,但随后我将不得不更改与用户模型相关的所有关系以及 Auth::id() 等其他内容。

有没有更简单的方法?

【问题讨论】:

【参考方案1】:

身份验证保护以这种方式引用用户 ID 字段:$user->getAuthIdentifier())

所以你可以在你的用户模型中这样做:

class User extends Model 
...

  public function getAuthIdentifier() 
    return $this->username;
  

如果您害怕 Auth::id() 更改,请查看会话保护的实现:

public function id()

    if ($this->user()) 
        return $this->user()->getAuthIdentifier();
    

更新:

但解决任何自定义授权问题的最佳方法是使用您自己的用户提供程序和身份验证保护。

这听起来可能很困难,但它就像实现两个接口一样简单。在此处查看官方文档 here 和 here。作为一个例子,你可以使用vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php(顺便看看它的助手特征GuardHelpers)和vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php

【讨论】:

以上是关于对多个用户表进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证

对来自多个来源(例如 Cognito 和 Azure)的令牌进行身份验证

Laravel 5 - 针对两个表进行身份验证

多个用户如何在 Node.js 中使用 Gmail 别名发送电子邮件,而无需 Google 开发人员控制台对每个用户进行用户身份验证?

SOA:Rails 多个客户端的用户身份验证和 api 授权

跨多个页面进行身份验证