You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目密码应存储在Users表还是Employees/Admin表?

结论优先:选统一存到Users表的方案

别分散存密码,后续做登录、权限校验、密码找回、安全审计的时候要写N套重复逻辑,漏改一处就出安全问题,完全没必要。

为什么不推荐把密码分存在employees、administrators表

  • 重复逻辑冗余:登录认证、密码重置、密码哈希规则升级、暴力破解防护这些逻辑要给每个角色表写一遍,维护成本极高
  • 安全风险高:哪天要加密码过期、登录失败锁定这类规则,很容易漏了某张表的校验逻辑,出漏洞就是大问题
  • 后续扩展麻烦:你现在规划要加users,以后再加供应商、访客这类角色,难道每加一个角色就新建一套密码存储逻辑?

Laravel下的多表关联实现方案

核心思路是 Users表只存所有身份通用的认证相关字段,各角色特有的字段存在自己的专属表里,通过一对一关联绑定,完全兼容Laravel默认的认证体系,不用重写核心逻辑。

第一步:调整表字段

  • users表保留Laravel默认生成的字段即可:id、name、email、password、remember_token、email_verified_at、created_at、updated_at,额外加userable_type、userable_id两个字段做多态关联,比硬写角色字段判断关联表灵活太多。
  • employees表只存员工专属字段:id、department、salary、entry_date这类和员工身份强相关的字段,不需要存密码、邮箱这些通用认证字段。
  • administrators表同理,只存管理员专属字段:比如permission_scope、last_login_ip这类,同样不用存认证相关字段。

注意:别在employees、administrators表里存任何和认证逻辑相关的字段,所有登录校验全走users表,从根源上避免逻辑分裂。

第二步:写模型关联

在User模型里加多态关联:

public function userable()
{
    return $this->morphTo();
}

然后在Employee模型、Administrator模型里加反向关联:

// Employee模型内
public function user()
{
    return $this->morphOne(User::class, 'userable');
}

// Administrator模型内
public function user()
{
    return $this->morphOne(User::class, 'userable');
}

第三步:业务逻辑使用示例

  • 创建员工账号的时候,先存users表的认证信息,再绑定employee信息:
$user = User::create([
    'name' => '张三',
    'email' => 'zhangsan@company.com',
    'password' => Hash::make('对应账号密码'),
]);
$employee = Employee::create([
    'department' => '技术部',
    'salary' => 20000,
    // 其余员工专属字段
]);
$employee->user()->save($user);
  • 登录后获取当前用户的角色信息:直接调用auth()->user()->userable即可,如果是员工账号会返回带Department、Salary字段的员工模型,如果是管理员账号会返回带管理员专属字段的模型,不需要手动判断角色查对应表。
  • Laravel默认的登录、密码找回、记住我等认证逻辑完全不用改,开箱可用。

额外注意点

如果后续要做细粒度角色权限控制,直接给users表加角色标记或者套常用的权限包即可,和这套多态关联的结构完全不冲突。


内容的提问来源于stack exchange,提问作者casual

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:15:41