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
相关产品推荐
相关产品推荐

