Laravel 邮箱验证 - 强制登录
Laravel email verification - Forced to be logged in
启用新的内置电子邮件验证安装后,一切正常(注册后发送电子邮件并单击激活启用帐户)。
但是,我遇到了用户必须登录才能进行验证过程的情况。这意味着,如果用户在使用验证 link 之前未登录,他将被重定向到登录页面,然后显示 /resources/view/auth/verify.blade.php
页面。
我正在联系社区,看看这是故意的、错误还是我做错了什么?有人运行遇到同样的情况吗?
我正在设置的站点可以 public 访问大多数页面,但仅限于某些页面(目前是用户门户)。我设置 routes/web.php
如下:
// Authentication
Auth::routes(['verify' => true]);
Route::group(['middleware' => ['auth', 'verified'], 'as' => 'portal.', 'prefix' => '/portal'], function () {
Route::get('/', 'PortalController@index');
Route::get('/profile', 'PortalController@index')->name('profile');
Route::get('/orders', 'PortalController@index')->name('orders');
});
通过跟踪验证过程,我能够发现该过程正在通过下面显示的中间件在 VerificationController
构造函数中强制登录。
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
通过注释第一行或添加->except('verify')
,登录页面未显示,但在Traits VerifiesEmails
方法验证时抛出错误,如下所示,因为用户显然不是记录它($request->user()
为空)。
public function verify(Request $request)
{
if ($request->route('id') == $request->user()->getKey() &&
$request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect($this->redirectPath())->with('verified', true);
}
我的问题是,有没有办法让它在不事先登录的情况下工作,或者这是在 5.7 中实现验证过程的方式? ...或者我做错了什么?
is there a way to get it to work without being loged-in beforehand, or
is this the way the Verification process is implemented in 5.7? ... or
what am I doing wrong?
这是在 Laravel 5.7 中实现验证过程的方式。 Laravel 使用已签名的 URL 进行验证。 URL 是用 id
参数生成的(id 作为用户 ID),当用户点击验证 link 时,会进行 3 次检查:
- 签名有效吗? (
signed
中间件)
- 签名中的用户 ID 是什么?这是最终将被验证的 ID
- 当前登录的用户ID是否相同?
您始终可以通过重写 VerificationController 中的验证方法来删除第三项检查,如下所示:
public function verify(Request $request)
{
$userId = $request->route('id');
$user = App\User::findOrFail($userId);
if ($user->markEmailAsVerified()) {
event(new Verified($user));
}
return redirect($this->redirectPath())->with('verified', true);
}
启用新的内置电子邮件验证安装后,一切正常(注册后发送电子邮件并单击激活启用帐户)。
但是,我遇到了用户必须登录才能进行验证过程的情况。这意味着,如果用户在使用验证 link 之前未登录,他将被重定向到登录页面,然后显示 /resources/view/auth/verify.blade.php
页面。
我正在联系社区,看看这是故意的、错误还是我做错了什么?有人运行遇到同样的情况吗?
我正在设置的站点可以 public 访问大多数页面,但仅限于某些页面(目前是用户门户)。我设置 routes/web.php
如下:
// Authentication
Auth::routes(['verify' => true]);
Route::group(['middleware' => ['auth', 'verified'], 'as' => 'portal.', 'prefix' => '/portal'], function () {
Route::get('/', 'PortalController@index');
Route::get('/profile', 'PortalController@index')->name('profile');
Route::get('/orders', 'PortalController@index')->name('orders');
});
通过跟踪验证过程,我能够发现该过程正在通过下面显示的中间件在 VerificationController
构造函数中强制登录。
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
通过注释第一行或添加->except('verify')
,登录页面未显示,但在Traits VerifiesEmails
方法验证时抛出错误,如下所示,因为用户显然不是记录它($request->user()
为空)。
public function verify(Request $request)
{
if ($request->route('id') == $request->user()->getKey() &&
$request->user()->markEmailAsVerified()) {
event(new Verified($request->user()));
}
return redirect($this->redirectPath())->with('verified', true);
}
我的问题是,有没有办法让它在不事先登录的情况下工作,或者这是在 5.7 中实现验证过程的方式? ...或者我做错了什么?
is there a way to get it to work without being loged-in beforehand, or is this the way the Verification process is implemented in 5.7? ... or what am I doing wrong?
这是在 Laravel 5.7 中实现验证过程的方式。 Laravel 使用已签名的 URL 进行验证。 URL 是用 id
参数生成的(id 作为用户 ID),当用户点击验证 link 时,会进行 3 次检查:
- 签名有效吗? (
signed
中间件) - 签名中的用户 ID 是什么?这是最终将被验证的 ID
- 当前登录的用户ID是否相同?
您始终可以通过重写 VerificationController 中的验证方法来删除第三项检查,如下所示:
public function verify(Request $request)
{
$userId = $request->route('id');
$user = App\User::findOrFail($userId);
if ($user->markEmailAsVerified()) {
event(new Verified($user));
}
return redirect($this->redirectPath())->with('verified', true);
}