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

如何在Laravel Breeze中触发无默认通知的密码重置并获取令牌?

Laravel 9 + Breeze 实现特定角色用户创建时发送自定义密码设置邮件

1. 生成密码重置令牌(不触发默认邮件)

Laravel的Password门面提供了独立生成重置令牌的方法,只会将令牌存入password_resets表,不会触发默认的找回密码邮件。在创建特定角色用户后,直接调用该方法获取令牌:

use Illuminate\Support\Facades\Password;

// 创建目标角色用户
$user = User::create([
    'name' => $request->input('name'),
    'email' => $request->input('email'),
    'role' => 'target_role', // 替换为你的特定角色标识
    // 注意:不要设置password字段,让用户自行设置初始密码
]);

// 生成重置令牌(仅存库,不发默认邮件)
$resetToken = Password::broker()->createToken($user);

2. 创建自定义欢迎邮件类

生成专属邮件类,用来承载自定义欢迎内容和密码设置链接:

生成邮件类

执行Artisan命令快速创建:

php artisan make:mail WelcomeWithPasswordSetupMail

编辑邮件类逻辑

在App\Mail\WelcomeWithPasswordSetupMail.php中注入用户和令牌,构建符合Breeze规则的重置链接:

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use App\Models\User;

class WelcomeWithPasswordSetupMail extends Mailable
{
    use Queueable, SerializesModels;

    public $user;
    public $resetToken;

    public function __construct(User $user, string $resetToken)
    {
        $this->user = $user;
        $this->resetToken = $resetToken;
    }

    public function build()
    {
        // 拼接Breeze默认的密码重置页面链接
        $resetUrl = route('password.reset', [
            'token' => $this->resetToken,
            'email' => $this->user->email,
        ]);

        return $this->subject('欢迎加入,请设置你的账号密码')
                    ->view('emails.welcome-with-password')
                    ->with([
                        'user' => $this->user,
                        'resetUrl' => $resetUrl,
                    ]);
    }
}

3. 编写邮件视图

在resources/views/emails/welcome-with-password.blade.php中编写自定义邮件内容:

<div style="max-width: 600px; margin: 20px auto; padding: 20px; border: 1px solid #eee; border-radius: 8px;">
    <h2>你好,{{ $user->name }}!</h2>
    <p>感谢你加入我们,请点击下方链接设置你的账号密码:</p>
    <a href="{{ $resetUrl }}" style="display: inline-block; margin: 15px 0; padding: 12px 24px; background: #2563eb; color: white; text-decoration: none; border-radius: 4px;">立即设置密码</a>
    <p>如果链接无法点击,请复制以下地址到浏览器访问:</p>
    <p style="word-break: break-all; color: #666;">{{ $resetUrl }}</p>
</div>

4. 在用户创建流程中发送自定义邮件

回到用户创建的控制器方法(比如UserController@store),判断用户角色后触发邮件发送:

use App\Mail\WelcomeWithPasswordSetupMail;
use Illuminate\Support\Facades\Mail;

// ... 用户创建代码 ...

// 仅给特定角色用户发送自定义欢迎邮件
if ($user->role === 'target_role') {
    Mail::to($user->email)->send(new WelcomeWithPasswordSetupMail($user, $resetToken));
}

关键注意事项

  • 用户密码字段:创建用户时不要设置password字段,或设为null,确保用户必须通过重置链接设置密码才能登录。
  • 令牌有效期:令牌有效期由config/auth.php中passwords.users.expire配置项控制(默认60分钟),可按需调整。
  • 路由验证:确保Breeze的password.reset路由存在(安装Breeze后已自动配置),无需额外添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:55:42