【问题标题】:How To: A Laravel Auth User Provider that finds users indirectly如何:一个 Laravel Auth 用户提供者,间接找到用户
【发布时间】:2017-05-20 16:54:21
【问题描述】:

我的 Laravel 项目涉及企业及其员工。 Eloquent 的主要模型是企业、用户和角色。一个用户可以有多个角色,每个角色都有不同的业务。

在身份验证方面,Laravel 身份验证设置非常适合,但有一个例外:用户没有电子邮件地址。相反,他们的每个角色都有一个电子邮件地址,用户可以使用其中任何一个登录。

我的用户对象有 passwordremember_token 字段。在我看来,这个对象仍然应该实现 Illuminate\Contracts\Auth\Authenticatable 接口,并且应该通过导入 Illuminate\Auth\Authenticatable 特征来实现。这听起来对吗?

说到Illuminate\Contracts\Auth\UserProvider接口:

  • 我认为我可以扩展 Eloquent 提供程序实现 Illuminate\Auth\EloquentUserProvider,并仅覆盖 retrieveByCredentials() 方法,但我不确定。我还需要覆盖其他方法吗?
  • 如果我确实扩展了 Eloquent 提供程序的实现,当我在 AuthServiceProviderboot() 方法中注册新的用户提供程序时,如何注入 $hasher$model 参数。这些值来自哪里(见下文)?
public function boot()
{
    $this->registerPolicies(); 
    Auth::provider('role', function ($app) {
        $hasher = ''; // ????
        $model = ''; // ???
        return new UserViaRoleProvider($hasher, $model);
    });
}

【问题讨论】:

  • 视情况而定。如果您的角色是一成不变的,您可以为每个角色创建一个数据库表,而不是一个全局角色表。这样每个角色表都包含该角色的所有信息,用户表只负责每个角色共有的全局信息,例如电子邮件。这样您仍然可以使用 Auth 系统。但只是在用户和角色之间建立关系。
  • 您好 Christophvh,我认为我们以不同的方式使用“角色”这个词。角色简单来说就是员工角色,比如“水管工”、“木匠”、“店员”等。所以如果我有 10,000 个用户,那么至少会有 10,000 个角色。 (用户必须始终拥有至少一个处于活动状态的角色)。
  • 所有 10 000 个角色在网站上都有不同的功能吗?因为在我看来,他们都像是员工。但有不同的权限。赋予员工不同的权利,你可以通过政策和权限来解决。但也许我不明白你的用例是的。因为您可以创建管理员帐户,所以这是来自可以登录的用户的电子邮件。该用户可以拥有管理多个角色的权限,例如
  • Christophvh,角色与网站上的权限无关。我可能应该称它们为 EmploymentContracts 或 StaffMembers。

标签: laravel authentication


【解决方案1】:

经过一些实验,我发现创建自己的 UserProvider 接口实现更容易。唯一需要考虑的方法是retrieveByCredentials()。它搜索角色,然后返回相关用户。

虽然我成功登录,但我最终放弃了这种方法,因为身份验证系统的其他部分假设用户和电子邮件之间存在一对一的关系。例如,密码重置功能。

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2021-06-09
    • 1970-01-01
    • 2019-02-02
    • 2020-06-03
    相关资源
    最近更新 更多