与多租户合作时在 Laravel 中进行电子邮件验证

问题描述 投票:0回答:1

所以我在 Laravel 中有后端,并应用 Laravel 对其进行租赁。前端是我的nuxt。每当我注册时,我希望它应该发送一封电子邮件进行电子邮件验证,这工作得很好!这就是我的注册方法

public function register(Request $request) {
        $user = [];

        $tenant = Tenant::create(['name' => $request->first_name . 'Team']);
        $tenant->run(function () use ($request){
            Artisan::call('db:seed', ['--class' => 'DatabaseSeeder']);
            $user = User::create([
                'first_name' => $request->first_name,
                'last_name' => $request->last_name,
                'email' => $request->email,
                'password' => Hash::make($request->password),
                'phone_number' => $request->phone_number,
               // 'verification_token' => Str::random(60),
            ]);
            //return $user;
            event(new Registered($user));
        });

       
        $tenant->domains()->create([
            'domain' => $request->domain_name,
        ]); 
       // $tenant->users()->attach($user->id);
    
       return response()->json(['message' => 'Successfully created - Check your email to verify!']);
    }

每当我单击电子邮件中的“验证电子邮件地址”按钮时,它都会导航到 http://domain1.localhost:8000/email/verify/2/2022b4a0a511f6ec4652cb178731383316eedf89?expires=1715858060&signature=d6fbdc6d1f5eeae04850be5 215287f90f38601fdcc7dd87fd120b49d32a5890f因为我的服务器在domain1.localhost上运行:8000

所以我的第一个发送电子邮件通知的链接工作得很好 ---

Route::middleware([
    'web',
    InitializeTenancyByDomain::class,
    PreventAccessFromCentralDomains::class,
])->group(function () {
    Route::get('/email/verify', function () {
        return view('auth.verify-email');
    })->name('verification.notice');
    
    /* Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
        $request->fulfill();
     
        return redirect('/home');
    })->name('verification.verify'); */

    Route::get('/email/verify/{id}/{hash}', [VerifyEmailController::class, '__invoke'])
    ->middleware(['signed', 'throttle:6,1'])
    ->name('verification.verify');
   // Route::get('/verification/{token}', [AuthController::class, 'verify_email']);

但是单击验证按钮后,需要根据我在上面链接中删除的文档对两个中间件进行签名和身份验证。我不希望它被登录,所以我创建了自己的控制器,名为

VerifyEmailController
。其中有以下代码 -

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Verified;
use Illuminate\Auth\Access\AuthorizationException;
use Laravel\Fortify\Contracts\VerifyEmailResponse;

class VerifyEmailController extends Controller
{
    public function __invoke(Request $request)
    {
        $user = User::findOrFail($request->route('id'));
        auth()->login($user);

        if (! hash_equals(sha1($user->getEmailForVerification()), (string) $request->route('hash'))) {
            throw new AuthorizationException;
        }

        if ($user->hasVerifiedEmail()) {
            return app(VerifyEmailResponse::class);
        }

        if ($user->markEmailAsVerified()) {
            event(new Verified($user));
        }

        return app(VerifyEmailResponse::class);
    }
}

    

仍然,每当我执行时,都会发送一封电子邮件,然后单击验证按钮,它会显示

方法 Illuminate\Auth\RequestGuard::login 不存在。

在 USER Modal 中,我已经这样做了 -

class User extends Authenticatable implements MustVerifyEmail{
   use Notifiable;

列出了功能::emailVerification()。请帮助我验证电子邮件并根据租户在数据库中设置已验证的列。

laravel multi-tenant fortify
1个回答
0
投票

在 Laravel 中使用多租户应用程序并实现电子邮件验证或密码重置功能时,您可能需要根据租户或用户类型自定义电子邮件通知。提供的代码片段演示了根据当前路由前缀自定义密码重置电子邮件通知。

以下是如何在多租户 Laravel 应用程序中处理电子邮件验证:

定义路由:为不同的用户类型或租户定义单独的路由。例如,您可能有 /admin、/staff 等路由。

自定义电子邮件通知:使用 ResetPassword::toMailUsing() 方法自定义密码重置电子邮件通知。根据当前路由前缀动态确定路由和URL。

创建视图:为密码重置电子邮件模板(本例中为 emails.reset-password)创建一个视图,并将重置 URL 传递给它。

电子邮件发送:当用户请求重置密码时,Laravel 内置的 ResetPassword 通知将被触发。 Laravel 将使用定义的通知方法自动发送电子邮件。

// Customize password reset email notification
ResetPassword::toMailUsing(static function ($notifiable, $token) {
    // Determine the current route prefix
    $currentRoutePrefix = Route::getCurrentRoute()->getPrefix();
    
    // Determine the route name based on the current route prefix
    $routeName = $currentRoutePrefix == '/admin' ? 'admin.password.reset' : 'staff-portal.password.reset';
    
    // Generate the reset password URL with the appropriate route name
    $url = route($routeName, $token) . '?email=' . $notifiable->getEmailForPasswordReset();
    
    // Create a mail message with the subject and pass the reset URL to the email view
    return (new MailMessage())
        ->subject('Reset Password Notification')
        ->view('emails.reset-password', compact('url'));
});

确保您已在 web.php 路由文件中为每种用户类型或租户定义了适当的密码重置路由。

© www.soinside.com 2019 - 2024. All rights reserved.