Laravel自定义用户提供者?用户提供者怎样实现?

自定义用户提供者可集成非Eloquent模型与多种数据源,如NoSQL、API、LDAP或文件,通过实现UserProvider和Authenticatable接口,灵活处理用户检索与密码验证,解决认证问题需确保接口方法正确实现并合理配置。

laravel自定义用户提供者?用户提供者怎样实现?

自定义 Laravel 用户提供者允许你使用非 Eloquent 模型或数据库表来验证用户。它通过实现

IlluminateContractsAuthUserProvider

接口来完成。这为你提供了极大的灵活性,尤其是在需要与遗留系统或外部认证服务集成时。

解决方案

要创建一个自定义用户提供者,你需要完成以下步骤:

创建用户模型: 如果你还没有,创建一个代表用户的类。这个类不需要继承 Eloquent 模型,但它必须实现

IlluminateContractsAuthAuthenticatable

接口。

namespace AppModels;use IlluminateContractsAuthAuthenticatable;class CustomUser implements Authenticatable{    protected $id;    protected $username;    protected $password;    protected $attributes = [];    public function __construct(array $attributes = [])    {        $this->attributes = $attributes;        if (isset($attributes['id'])) {            $this->id = $attributes['id'];        }        if (isset($attributes['username'])) {            $this->username = $attributes['username'];        }        if (isset($attributes['password'])) {            $this->password = $attributes['password'];        }    }    public function getAuthIdentifierName()    {        return 'id';    }    public function getAuthIdentifier()    {        return $this->id;    }    public function getAuthPassword()    {        return $this->password;    }    public function getRememberToken()    {        return $this->attributes['remember_token'] ?? null;    }    public function setRememberToken($value)    {        $this->attributes['remember_token'] = $value;    }    public function getRememberTokenName()    {        return 'remember_token';    }    public function setAttribute($key, $value) {        $this->attributes[$key] = $value;    }    public function getAttribute($key) {        return $this->attributes[$key] ?? null;    }    public function __get($key) {        return $this->getAttribute($key);    }    public function __set($key, $value) {        $this->setAttribute($key, $value);    }}

创建用户提供者: 创建一个类来实现

IlluminateContractsAuthUserProvider

接口。这个类负责从你的数据源检索用户,并验证他们的凭据。

namespace AppProviders;use IlluminateContractsAuthAuthenticatable;use IlluminateContractsAuthUserProvider;use AppModelsCustomUser; // 替换为你的用户模型use IlluminateSupportFacadesHash;class CustomUserProvider implements UserProvider{    protected $model;    public function __construct(string $model)    {        $this->model = $model;    }    public function retrieveById($identifier)    {        // 从你的数据源检索用户,例如数据库、API等        // 这里只是一个示例,你需要根据你的实际情况进行修改        $user = $this->getUserFromDataSource(['id' => $identifier]);        if ($user) {            return new $this->model($user);        }        return null;    }    public function retrieveByToken($identifier, $token)    {        // 从你的数据源检索用户,并验证令牌        // 同样,这里只是一个示例        $user = $this->getUserFromDataSource(['id' => $identifier, 'remember_token' => $token]);        if ($user) {            return new $this->model($user);        }        return null;    }    public function updateRememberToken(Authenticatable $user, $token)    {        // 更新用户的记住我令牌        // 同样,这里只是一个示例        $this->updateUserRememberToken($user->getAuthIdentifier(), $token);    }    public function retrieveByCredentials(array $credentials)    {        // 从你的数据源检索用户,基于提供的凭据        // 同样,这里只是一个示例        if (empty($credentials) ||            (count($credentials) === 1 &&             array_key_exists('password', $credentials))) {            return null;        }        $query = [];        foreach ($credentials as $key => $value) {            if (! str_contains($key, 'password')) {                $query[$key] = $value;            }        }        $user = $this->getUserFromDataSource($query);        if ($user) {            return new $this->model($user);        }        return null;    }    public function validateCredentials(Authenticatable $user, array $credentials)    {        // 验证用户提供的凭据是否正确        // 同样,这里只是一个示例        $plain = $credentials['password'];        return Hash::check($plain, $user->getAuthPassword());    }    // 模拟从数据源获取用户数据    private function getUserFromDataSource(array $credentials)    {        // 替换为你的实际数据源逻辑        // 例如,从数据库查询、调用API等        $users = [            [                'id' => 1,                'username' => 'testuser',                'password' => Hash::make('password'),                'remember_token' => null,            ],            [                'id' => 2,                'username' => 'anotheruser',                'password' => Hash::make('anotherpassword'),                'remember_token' => null,            ],        ];        foreach ($users as $user) {            $match = true;            foreach ($credentials as $key => $value) {                if ($user[$key] != $value) {                    $match = false;                    break;                }            }            if ($match) {                return $user;            }        }        return null;    }    // 模拟更新用户记住我令牌    private function updateUserRememberToken($id, $token)    {        // 替换为你的实际数据源更新逻辑        // 例如,更新数据库记录、调用API等        // 这里只是一个示例,没有实际更新操作    }}

注册用户提供者:

config/auth.php

文件中,注册你的自定义用户提供者。

'providers' => [    'users' => [        'driver' => 'custom',        'model' => AppModelsCustomUser::class, // 替换为你的用户模型    ],],

配置认证守卫:

config/auth.php

文件中,配置你的认证守卫以使用你的自定义用户提供者。

'guards' => [    'web' => [        'driver' => 'session',        'provider' => 'users',    ],    'api' => [        'driver' => 'token',        'provider' => 'users',        'hash' => false,    ],],

自定义用户提供者可以处理哪些类型的用户数据源?

自定义用户提供者最大的优势在于其灵活性。它可以处理几乎任何类型的用户数据源,包括:

非关系型数据库 (NoSQL): 例如 MongoDB, Redis 等。你可以编写用户提供者来从这些数据库中检索用户数据。外部 API: 如果你的用户数据存储在外部 API 中,你可以使用用户提供者来调用 API 并验证用户。LDAP 服务器: 用户提供者可以连接到 LDAP 服务器并验证用户凭据。平面文件: 虽然不常见,但你甚至可以使用用户提供者从平面文件中读取用户数据。

关键在于

retrieveById

,

retrieveByToken

,

retrieveByCredentials

validateCredentials

方法的实现。 这些方法定义了如何从你的数据源检索用户以及如何验证他们的凭据。

如何处理用户密码的加密和验证?

Laravel 提供了

Hash

facade 来处理密码的加密和验证。 你应该始终使用

Hash::make()

来加密用户密码,并使用

Hash::check()

来验证密码。

CustomUserProvider

类的

validateCredentials

方法中,你可以使用

Hash::check()

来验证用户提供的密码是否与存储在数据源中的加密密码匹配。

public function validateCredentials(Authenticatable $user, array $credentials){    $plain = $credentials['password'];    return Hash::check($plain, $user->getAuthPassword());}

确保在用户注册或更新密码时使用

Hash::make()

来加密密码。

使用自定义用户提供者进行身份验证时,常见的错误以及如何解决?

在使用自定义用户提供者时,可能会遇到一些常见的错误:

Target [IlluminateContractsAuthAuthenticatable] is not instantiable

: 这通常意味着你的用户模型没有正确实现

IlluminateContractsAuthAuthenticatable

接口,或者你没有正确地将你的用户模型绑定到容器中。 检查你的用户模型是否实现了所有必需的方法,并确保在

config/auth.php

文件中正确配置了

model

选项。

Call to undefined method

: 这通常意味着你的用户模型缺少

IlluminateContractsAuthAuthenticatable

接口中定义的方法。 确保你的用户模型实现了

getAuthIdentifierName

,

getAuthIdentifier

,

getAuthPassword

,

getRememberToken

,

setRememberToken

, 和

getRememberTokenName

方法。

身份验证失败: 这可能是由于多种原因造成的。 首先,确保你的

retrieveByCredentials

方法正确地从你的数据源检索用户。 然后,确保你的

validateCredentials

方法正确地验证用户提供的凭据。 使用

dd()

函数来调试这些方法,以确保它们按预期工作。

Class 'AppProvidersCustomUserProvider' not found

: 这通常意味着你没有正确地注册你的用户提供者。 确保你在

config/app.php

文件的

providers

数组中注册了你的用户提供者。

Remember Me 功能不起作用: 确保你的用户模型实现了

getRememberToken

,

setRememberToken

, 和

getRememberTokenName

方法,并且你的

updateRememberToken

方法正确地更新了数据源中的 remember token。

总而言之,自定义用户提供者为 Laravel 身份验证提供了极大的灵活性。 通过正确实现

IlluminateContractsAuthUserProvider

IlluminateContractsAuthAuthenticatable

接口,你可以将 Laravel 身份验证与任何类型的用户数据源集成。

以上就是Laravel自定义用户提供者?用户提供者怎样实现?的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/198922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
岚图卢放援引华为任正非观点:车的最高级别就是安全
上一篇 2026年9月11日 01:59:58
《因狄斯的谎言2:燃烧的火种》定档11.7首发——经典Roguelite续作全面进化
下一篇 2026年9月11日 02:03:59

相关推荐

  • 抖音商城是哪个公司在运营

    抖音商城的运营主体揭晓 抖音商城由北京微播视界科技有限公司负责运营。 作为抖音背后的母公司,字节跳动通过其全资子公司——微播视界,全面掌舵抖音平台及其电商板块的日常运作。依托雄厚的技术积累与多元化的业务布局,为用户打造流畅、智能且高效的购物环境。 抖音商城究竟是什么? 抖音商城是抖音App内嵌的一站…

    2026年9月21日
    100
  • mysql如何理解索引选择性

    索引选择性是衡量索引效率的关键指标,定义为索引列不同值数量与总行数的比值,范围在0到1之间。越接近1,数据唯一性越高,索引过滤能力越强,查询性能越好。例如主键列选择性为1,而性别列因重复值多选择性极低。MySQL优化器会优先选择高选择性索引以缩小搜索范围,提高执行效率。可通过SELECT COUNT…

    2026年9月21日
    000
  • iPhone 17如何快速清理存储空间

    首先通过系统推荐一键优化释放8-12GB空间,再重点清理微信缓存、合并重复照片并开启优化存储,最后深度清理Safari缓存、删除大型App及关闭自动下载,可高效腾出数十GB存储。 虽然目前还没有iPhone 17,但根据2025年最新的iOS系统清理方法,无论你使用的是哪款iPhone,都可以通过以…

    2026年9月21日
    100
  • 卖不动!iPhone Air暂时停产!库存已经够用了

    据数码博主“定焦数码”透露,苹果iphone air目前已暂停生产。此次调整主要受两方面因素影响:一是该机型在海外市场销量未达预期;二是中国大陆地区的上市时间有所推迟。不过,由于前期已储备了充足的整机库存,当前市场供应不受影响,未来将根据订单积累情况再决定恢复生产的时机。 这一产能变动与此前投资机构…

    2026年9月21日
    000
  • 豆包语音2.0— 字节跳动推出的升级版AI语音模型

    豆包语音2.0是什么 豆包语音2.0是字节跳动推出的升级版ai语音模型,包含两大核心模型:豆包语音合成模型2.0(doubao-seed-tts 2.0)和豆包声音复刻模型2.0(doubao-seed-icl 2.0)。语音合成模型2.0支持对话式合成,可精准理解语义和情感,实现复杂公式朗读,准确…

    2026年9月21日
    100
  • Linux如何查看sudo执行的历史记录

    Linux如何查看sudo执行的历史记录Linux如何查看sudo执行的历史记录Linux如何查看sudo执行的历史记录Linux如何查看sudo执行的历史记录

    要追溯sudo执行的命令,需查看系统日志或配置sudo日志;在Ubuntu/Debian中查/var/log/auth.log,CentOS/RHEL中查/var/log/secure,或使用journalctl _COMM=sudo筛选;通过配置/etc/sudoers中的Defaults log…

    2026年9月21日 用户投稿
    300
  • 如何为VSCode安装新的字体?

    先在操作系统安装字体文件,再在VSCode设置中指定字体名称。1. Windows右键安装.ttf/.otf文件,macOS用字体册安装,Linux复制到~/.fonts并运行fc-cache -fv;2. VSCode中通过设置界面或编辑settings.json修改”editor.f…

    2026年9月21日
    000
  • mysql如何配置ssl安全连接

    MySQL支持SSL时返回YES,通过生成证书并配置my.cnf中的ssl-ca、ssl-cert、ssl-key启用SSL,创建REQUIRE SSL用户确保加密连接,客户端连接需指定证书参数,STATUS或Ssl_cipher验证加密状态。 MySQL 配置 SSL 安全连接可以提升数据库通信的…

    2026年9月21日
    200
  • iPhone SE 2022常见发热原因及处理方法 科普指南

    iPhone SE 2022 发热主因包括高性能任务、边充边用、高温环境、厚手机壳、后台程序及电池老化;正常使用下发热属常见现象,通过停止高耗能操作、移至阴凉处、取下手机壳、开启低电量模式可快速降温;长期建议避免边充边玩、选用轻薄壳、定期清理系统、更新 iOS 及检查电池健康,若待机过热或有鼓包异味…

    2026年9月21日
    100
  • 小红书视频封面不显示怎么办 小红书封面加载与设置技巧

    小红书视频封面不显示通常由上传设置、网络或缓存问题导致。先检查网络稳定性,确保封面尺寸为1080×1440像素(3:4比例),格式为JPG或PNG且不超过5MB;上传时使用Wi-Fi避免中断,在编辑页面务必点击“设为封面”并确认保存;发布后若未显示可等待几分钟刷新或重启App查看。优先尝试重新编辑封…

    2026年9月21日
    100
  • 抖音奈雪点单小程序怎么弄的

    抖音奈雪点单小程序是专为抖音用户打造的一款便捷点单工具,依托抖音平台生态,让用户无需跳转即可轻松完成奈雪饮品的选购与下单。为提升用户体验,奈雪茶庄同步推出了详尽的操作说明和使用指引。 小程序使用步骤 1. 打开抖音APP,在搜索栏输入“奈雪点单”查找相关小程序,或通过抖音首页的“附近的小程序”入口快…

    2026年9月21日
    100
  • 从 API 响应中提取元素并在 Java 中使用

    本文介绍了如何在 Java 中解析 API 响应,并从中提取特定元素的值。以 JSON 格式的响应为例,演示了如何使用 Jackson 库将 JSON 字符串转换为 Java 对象,并提取所需的数据,例如账户 ID,以便在后续操作中使用。 在 Java 开发中,经常需要与 API 进行交互,并从 A…

    2026年9月21日
    100
  • 苹果痛失AI大将,Siri关键负责人转投Meta

    苹果痛失AI大将,Siri关键负责人转投Meta苹果痛失AI大将,Siri关键负责人转投Meta苹果痛失AI大将,Siri关键负责人转投Meta苹果痛失AI大将,Siri关键负责人转投Meta

    近日有消息显示,%ignore_a_1%公司负责siri改革的关键高管ke yang已确认离职,并将加入竞争对手meta。这一变动不仅为苹果雄心勃勃的ai计划蒙上了一层阴影,也再次凸显了其在留住顶尖人才方面面临的严峻挑战。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月21日 用户投稿
    200
  • REDMI有史以来最强手机!K90 Pro Max这次真的强到爆

    REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆REDMI有史以来最强手机!K90 Pro Max这次真的强到爆

    如果说redmi过去是“性价比之王”,那么这一次,它彻底进化成了“性能怪兽”。10月23日即将登场的redmi k90 pro max,不仅是品牌年度旗舰的压轴大戏,更是其历史上首款冠以“pro max”之名的巅峰之作。 这可以看作是REDMI向高端市场发起冲击的正式宣言。卢伟冰亲自放话:“给4K价…

    2026年9月21日 用户投稿
    300
  • Linux如何升级源码编译安装的软件

    Linux如何升级源码编译安装的软件Linux如何升级源码编译安装的软件Linux如何升级源码编译安装的软件Linux如何升级源码编译安装的软件

    升级源码编译软件需手动操作,核心是卸载旧版后编译安装新版。1. 确认当前版本、路径及编译参数;2. 下载并解压新版本源码,核对完整性;3. 使用相同配置参数执行 ./configure 和 make 编译;4. 停止旧服务,执行 make install 覆盖文件;5. 验证版本与配置,启动服务并检…

    2026年9月21日 用户投稿
    100
  • 访问DeepSeek官方网站 deepseek在线版免费登录

    答案:DeepSeek在线版免费登录入口位于官网https://chat.deepseek.com/sign_in,用户可通过手机号验证码或微信授权登录,新用户免注册,登录后自动创建账户并同步多端数据,支持网页和APP使用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 De…

    2026年9月21日
    100
  • Windows11提示“此电脑无法运行Windows 11”但已经安装了怎么办_Windows11提示无法运行系统修复方法

    首先检查并启用TPM 2.0与安全启动,进入UEFI设置开启相关选项;若硬件接近要求,可通过注册表新建AllowUpgradesWithUnsupportedTPMOrCPU并设值为1跳过检查;运行sfc /scannow修复系统文件;专业版用户还可通过组策略启用“移除此电脑不符合Windows 1…

    2026年9月21日
    200
  • 如何快速在大量文件中进行全局搜索和替换?

    修改文件内容用Word或Notepad++批量替换,改文件名则用星优或核烁等重命名工具,结合Everything快速定位,提升效率。 面对大量文件时,全局搜索和替换的关键是选对工具。手动一个一个处理效率太低,用对方法能省下大量时间。核心思路是:根据你要改的是“文件里的文字”还是“文件的名字”,选择不…

    2026年9月21日
    200
  • Valkey 9.0.0 正式 GA,Linux 基金会维护的 Redis 分支

    由 linux 基金会主导维护的 redis 分支——开源内存数据库 valkey 9.0.0 正式发布,现已进入通用可用(ga)阶段。本次版本带来了多项关键性的性能提升与功能增强,重点聚焦于更高效的集群数据迁移、精细化的哈希字段管理能力,以及对大规模分布式部署场景的深度优化。 原子化槽位迁移(At…

    2026年9月21日
    100
  • 荣耀X50 GT如何设置动态壁纸 荣耀X50 GT个性化主题操作指南

    首先通过“主题”App设置动态壁纸,可选系统内置的风景、科技或动漫类动态壁纸,预览后下载应用即可;接着能将相册中的视频设为动态桌面,需在动态壁纸页面导入本地视频,裁剪调整后生成并应用;最后还可搭配主题风格、图标、锁屏和字体进行个性化设置,整体操作简单快捷,几分钟完成,但使用高清或长视频可能增加电量消…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信