php - 基于用户角色的 Laravel 登录重定向问题:重定向太多次
问题描述
我正在尝试使用中间件在 Laravel 中编写代码,该中间件将根据用户的角色重定向用户。问题是我收到错误:无论用户是简单用户还是管理员,都重定向了太多次。到目前为止,我正在通过在中间件中提供字符串来检查用户是否是管理员,我还没有访问数据库。任何帮助是极大的赞赏。
下面是我的代码:
mid.php(中间件)
class mid
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($request->session()->has('user')){
$user = $request->session()->get('user');
if($user == "pujan@pujanovic.com"){
return redirect()->route('adminview');
}else{
return redirect()->route('userview');
}
}else{
return redirect()->route('login')->with('poruka','Niste administrator!');
}
return $next($request);
}
}
网页.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get("/","HomeController@index")->name('index');
Route::get("/login","HomeController@loginview")->name('login');
Route::get("/admin","HomeController@adminview")->name('adminview')->middleware('mid');
Route::post("/login","LoginController@login");
Route::get("/user","HomeController@userview")->name('userview')->middleware('mid');
登录控制器.php
<?php
namespace App\Http\Controllers;
use Session;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\URL;
use App\Models\UserModel;
class LoginController extends Controller
{
//
public function login(Request $request){
$email=$request->input('email');
$password=$request->input('password');
$this->validate($request,[
'email'=>'required',
'password'=>'required'
]);
$pass=md5($password);
$data=DB::SELECT("SELECT * FROM users where email=? and password=?",[$email,$password]);
if (count($data)){
session()->put('user',$email);
$value=session('user');
return redirect()->route('userview');
}else{
return redirect()->route('login')->with('success','wrong data');
}
}
}
解决方案
您的中间件将重定向不在"pujan@pujanovic.com"
该userview
路由的用户。您已将此中间件分配给userview
路由。
因此,如果会话中有一个用户并且他们不是"pujan@pujanovic.com"
,他们将进入一个无限循环,被重定向到相同的路由,然后中间件将再次将他们重定向到相同的路由,在一个循环中。
当您将其分配给adminview
. 如果您是“管理员”并且您尝试访问该路线,那么您也将陷入无限循环。
简而言之,您是在告诉它无休止地重定向。
这个中间件永远不会让任何人到达目标路由。它只能重定向到其他地方。
更新:
这是您可以为管理员检查中间件做什么的粗略想法
管理中间件:
public function handle($request, $next)
{
// an auth middleware could handle this itself
if (! ($email = $request->session()->get('user'))) {
// not logged in at all
return redirect()->route('login');
}
if ($email != 'admin@email.com') {
// not the admin user
// redirect them away
return redirect()->route(...);
}
// let the request pass through as we have determined they are the admin
return $next($request);
}
该中间件将被分配给您只希望管理员能够访问的路由。
推荐阅读
- javascript - 如何将一个集合字段合并到另一个集合字段而不重复
- sql - Pivot 中的参数
- bash - Grep - 获取每次出现的行中的字符位置
- python - 保存生成的矢量图层 QGIS 3.6 python 脚本
- reactjs - 父组件状态改变后重新渲染子组件
- vue.js - 如何从非 vue 类调用 vue i18n?
- javascript - 为什么我不能从此链接获取 XML 文档,为什么在字符串中我可以让所有标签括号都变成引号?
- python - 使用 Theano 后端的 Keras Flatten() 层行为不一致
- angular - 无法从子组件访问值:未定义 - Angular 7
- sass - 我可以创建多个 css 类名作为一个语句吗?