【问题标题】: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() 等其他内容。

有没有更简单的方法?

【问题讨论】:

    标签: php laravel authentication eloquent


    【解决方案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();
        }
    }
    

    更新:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      相关资源
      最近更新 更多