我有一个小小的困境,我正在尝试建立一个登录系统,使用laravel auth脚手架区分普通用户和管理员用户。
问题在于中间件中存在无限重定向循环。
按下登录按钮后,它会不断重定向到路线,问题是,我怎样才能解决这个问题“laravel方式”或其他任何方式。
这是我的控制器: 1.基本的家庭控制器:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
}
主管理员 - 进入控制器:
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class Start extends Controller
{
public function index(){
return view('admin/index');
}
}
登录控制器(由我修改的auth脚手架中的默认控制器,我删除了构造函数):
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
}
中间件(如果RedirectIfAuthenticated则重定向):
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
if(Auth::user()->type == 2){//if user type is 1 then it's an admin.
return redirect()->route('web-admin');
}else{
return redirect()->route('home');
}
}
return $next($request);
}
}
路径文件(网络路线)
Route::get('/', function () {
return view('index');
});
Auth::routes();
Route::middleware(['auth','guest'])->group(function() {
Route::get('home',['as'=>'home', 'uses'=>'HomeController@index']);
Route::get('web-admin',['as'=>'web-admin', 'uses'=>'Admin\Start@index']);
});
答案 0 :(得分:0)
guest / RedirectIfAuthenticated 将任何请求重定向到经过身份验证的用户的相应主路由。问题是管理主页路由也是这个中间件的背后,这就是为什么它一直重定向到同一页面。
您需要从路由组中删除来宾中间件 - 它只应应用于仅供未经身份验证的用户使用的路由。
答案 1 :(得分:0)
当然,这是一个无限循环,因为您将guest和auth中间件都应用于您的路由,因此经过身份验证的用户也将被重定向,这是一个无限循环。
将 RedirectIfAuthenticated.php 保留为原始代码,并根据其类型在主控制器中重定向经过身份验证的用户:
`<rewrite>
<rules>
<rule name="hide .php extension" stopProcessing="true">
<match url="^(.*)$" ignoreCase="true" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}.php" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="{R:0}.php" />
</rule>
</rules>
</rewrite>`
您可以在管理控制器中执行相同的重定向,以便普通用户在尝试访问管理页面时重定向它们。
另外修改 web.php 路由如下:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
// if type 1 is admin, why did you redirect type 2 to web-admin?!
if($request->user()->type == 2) { //if user type is 1 then it's an admin.
return redirect()->route('web-admin');
}
return view('home');
}
}