我有一条注册路线。在第一步上注册后,它将通过电子邮件发送给用户以验证其帐户并在其电子邮件上具有链接。单击链接后,它应重定向到signup/step2
,并完成操作,他可以访问job-seeker/home
。
因此逻辑是完成注册后,用户无法再次访问signup/step2
,因为用户已经完成填写表格。
并且在填充signup/step2
之前,他也无法访问job-seeker/home
。反之亦然。
基本上,我的中间件首先是:检查用户是否完成了step2并在数据库的is_completed
列上添加了true。然后在第二种中间件上,只能按角色访问他的路线,他无法访问其他角色的其他路线,并根据他的角色重定向到他的家。
但是,即使我仍然没有填写step2,它也会引发太多重定向和切换。这是我的下面的gif。
我的代码
Kernel.php
class Kernel extends HttpKernel
{
...
protected $routeMiddleware = [
...
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'isCompleted' => \App\Http\Middleware\IsCompleted::class,
];
Middleware / IsCompleted.php
class IsCompleted
{
public function handle($request, Closure $next)
{
if(auth()->user()->isCompleted == 1){
return $next($request);
}
// if 0, redirect to step2
return redirect()->route('register.step2');
}
中间件/RedirectIfAuthenticated.php
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
if ( Auth::user()->hasRole('job-seeker') ) {
return redirect()->route('job-seeker.home');
} else if(Auth::user()->hasRole('admin')) {
return redirect()->route('admin.home');
}
}
return $next($request);
Routes / Web.php
<?php
Route::get('/', function () {
return view('welcome');
});
Route::group(['middleware' => ['verified', 'isCompleted']], function() {
Route::group(['prefix' => 'admin', 'name' => 'admin.'], function() {
Route::get('/home', function(){ return "test"; })->name('admin.home');
});
Route::group(['prefix' => 'job-seeker', 'name' => 'job-seeker.'], function() {
Route::get('/home', 'Jobseeker\HomeController@index')->name('job-seeker.home');
});
});
Auth::routes(['verify' => true, 'register' => false]);
Route::get('signup/{usertype}' , 'Auth\RegisterController@getStep1')->name('register.step1');
Route::post('signup/{usertype}' , 'Auth\RegisterController@postStep1');
Route::group(['middleware' => ['auth']], function() {
Route::get('signup/step2' , 'Auth\RegisterController@getStep2')->name('register.step2');
Route::post('signup/step2' , 'Auth\RegisterController@postStep2');
});
编辑1
我检查页面并转到“网络”选项卡,这就是结果。
答案 0 :(得分:0)
您的RedirectIfAuthenticated
始终保持重定向。对于经过身份验证的用户,它永远不会到达$next($request)
。
您需要具有类似的逻辑
if (route is seeker.home and user can visit seeker.home) {
return $next(request);
}
代替
return redirect()->route('job-seeker.home');