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

Laravel中如何在用户创建凭证邮件中发送明文密码

解决Laravel创建用户时发送明文密码邮件的问题

这个场景我之前开发后台用户管理功能时也遇到过!核心问题就是Laravel会自动哈希密码存入数据库,所以从模型里直接拿$notifiable->password只能得到哈希值,根本拿不到明文。要实现需求,关键得在密码哈希之前就把明文密码传递给通知类,而不是从已经入库的模型里取。

下面是具体的实现步骤:

1. 修改用户创建逻辑(控制器/服务层)

在创建用户的代码里,先把明文密码临时存起来,哈希后再创建用户,最后把明文密码传给通知:

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use App\Notifications\AccountCreated;

public function store(Request $request)
{
    // 验证请求参数
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8',
    ]);

    // 临时保存明文密码(这一步是关键!)
    $plainPassword = $validated['password'];

    // 哈希密码后创建用户
    $user = User::create([
        'name' => $validated['name'],
        'email' => $validated['email'],
        'password' => Hash::make($validated['password']),
    ]);

    // 发送通知时把明文密码传进去
    $user->notify(new AccountCreated($plainPassword));

    return redirect()->route('users.index');
}

2. 重构你的AccountCreated通知类

给通知类加个属性存储明文密码,通过构造函数接收,然后在邮件内容里使用这个属性:

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class AccountCreated extends Notification
{
    use Queueable;

    // 新增属性存储明文密码
    private $plainPassword;

    // 构造函数接收明文密码
    public function __construct($plainPassword)
    {
        $this->plainPassword = $plainPassword;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('你的账户已成功创建')
            ->greeting('你好,'.$notifiable->name.'!')
            ->line('以下是你的登录凭证,请妥善保管:')
            ->line('用户名:'.$notifiable->email) // 假设用邮箱作为登录用户名
            ->line('密码:'.$this->plainPassword)
            ->action('立即登录', url('/login'))
            ->line('为了账户安全,请登录后尽快修改密码!');
    }
}

重要提醒(安全性建议)

直接发送明文密码存在安全风险,邮件传输过程中可能被拦截。如果业务允许,更推荐的方案是:

  • 创建用户时不设置初始密码,而是发送密码重置链接给用户,让用户自行设置密码
  • 如果必须发送初始密码,一定要在邮件里强制提醒用户登录后立即修改

内容的提问来源于stack exchange,提问作者Hakeem.D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:58:15