如何:间接查找用户的Laravel身份验证用户提供程序

如何:间接查找用户的Laravel身份验证用户提供程序,laravel,authentication,Laravel,Authentication,我的Laravel项目涉及企业及其员工。主要的雄辩模型是业务、用户和角色。一个用户可以有多个角色,每个角色具有不同的业务 谈到身份验证,Laravel Auth设置非常适合,但有一个例外:用户没有电子邮件地址。相反,他们的每个角色都有一个电子邮件地址,用户可以使用其中任何一个进行登录 我的用户对象具有密码和记住令牌字段。在我看来,这个对象仍然应该实现illumb\Contracts\Auth\Authenticatable接口,并且应该通过导入illumb\Auth\Authenticatabl

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

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

我的用户对象具有
密码
记住令牌
字段。在我看来,这个对象仍然应该实现
illumb\Contracts\Auth\Authenticatable
接口,并且应该通过导入
illumb\Auth\Authenticatable
特性来实现。这听起来对吗

当涉及到
illumb\Contracts\Auth\UserProvider
界面时:

  • 我认为我可以扩展雄辩的提供者实现,
    illumb\Auth\EloquentUserProvider
    ,并只覆盖
    retrieveByCredentials()
    方法,但我不确定。我也需要重写其他方法吗
  • 如果我扩展了雄辩的提供程序实现,那么当我在我的
    AuthServiceProvider
    boot()
    方法中注册新的用户提供程序时,如何注入
    $hasher
    $model
    参数呢。这些值来自何处(见下文)

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


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

视情况而定。如果您的角色是一成不变的,那么您可以为每个角色创建一个数据库表,而不是一个全局角色表。这样,每个角色表都包含该角色的所有信息,用户表只负责每个角色共有的全局信息,例如电子邮件。这样,您仍然可以使用Auth系统。但是只需要在用户和角色之间建立关系。嗨,Christophvh,我认为我们用不同的方式使用“角色”这个词。一个角色只是一个员工角色,所以“管道工”、“木匠”、“店员”等等。所以如果我有10000个用户,那么至少会有10000个角色。(用户必须始终至少有一个角色处于活动状态)。是否所有10000个角色在网站上都具有不同的功能?因为在我看来,他们都像是雇员。但是有不同的权限。赋予员工不同的权利,您可以通过策略和权限解决问题。但也许我不明白你的用例是的。因为您可以创建管理员帐户,所以这是来自可以登录的用户的电子邮件。该用户可以拥有管理多个角色的权限,例如Christophvh,这些角色与站点上的权限无关。我可能应该称他们为雇佣合同或员工。
public function boot()
{
    $this->registerPolicies(); 
    Auth::provider('role', function ($app) {
        $hasher = ''; // ????
        $model = ''; // ???
        return new UserViaRoleProvider($hasher, $model);
    });
}