php - Laravel 用户基于角色登录到不同的主页
问题描述
情景
我有一个简单的应用程序,它有四个主要用户角色。
- Admin(AdminController 和 Admin 中间件文件)
- 主持人(主持人控制器和主持人中间件文件)
- Agent(AgentController 和 Agent 中间件文件)
- 供应商(SupplierController 和供应商中间件文件)
如上所述,每个角色都有一个单独的控制器和中间件。每个控制器都有 index 方法,将控制器引导到受尊重的主视图。
管理控制器文件
class AdminController extends Controller
{
public function index()
{
return view('admin.home');
}
}
注意:对于每个角色,其他 3 个控制器文件也是如此。
中间件\Admin.php 文件
use Auth;
class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//return $next($request);
if(auth::check() && Auth::user()->role == 1){
return $next($request);
}
else {
return redirect()->route('login');
}
}
}
注意:对于每个角色,其他 3 个中间件文件也是如此。
内核.php
protected $routeMiddleware = [
...
'admin' => \App\Http\Middleware\Admin::class,
'moderator' => \App\Http\Middleware\Moderator::class,
'agent' => \App\Http\Middleware\Agent::class,
'supplier' => \App\Http\Middleware\Supplier::class,
];
路线\web.php
Route::get('/admin', 'AdminController@index')->middleware('admin');
Route::get('/moderator', 'ModeratorController@index')->middleware('moderator');
Route::get('/agent', 'AgentController@index')->middleware('agent');
Route::get('/supplier', 'SupplierController@index')->middleware('supplier');
\App\Http\Middleware\RedirectIfAuthenticated
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($guard == "admin" && Auth::guard($guard)->check()) {
return redirect('/admin');
}
if ($guard == "moderator" && Auth::guard($guard)->check()) {
return redirect('/moderator');
}
if ($guard == "agent" && Auth::guard($guard)->check()) {
return redirect('/agent');
}
if ($guard == "supplier" && Auth::guard($guard)->check()) {
return redirect('/supplier');
}
return $next($request);
}
}
最后我的登录控制器
use Auth;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo;
public function redirectTo()
{
switch(Auth::user()->role){
case 1:
$this->redirectTo = '/admin';
return $this->redirectTo;
break;
case 2:
$this->redirectTo = '/moderator';
return $this->redirectTo;
break;
case 3:
$this->redirectTo = '/agent';
return $this->redirectTo;
break;
case 4:
$this->redirectTo = '/supplier';
return $this->redirectTo;
break;
default:
$this->redirectTo = '/login';
return $this->redirectTo;
}
// return $next($request);
}
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//$this->middleware('guest')->except('logout');
}
}
问题
Q1。这是实现这一目标的最佳方式还是最有效的方式?
Q2。这种方法是否足够安全,可以在真正的商业应用中使用?
Q3。路由按照预期的方式工作,例如,如果我去 localhost/login
输入相关凭据,它会根据用户角色转到相关主页。当我进入localhost/admin
并尝试输入并转到 urllocalhost/agent
时,它只是进入登录localhost/login
而不注销用户。
但是,如果用户不想尝试再次登录,或者想返回他的仪表板,则当单击“仪表板”时,应用程序无法识别登录用户的正确主页以返回。Auth
单击时,它会重定向到我已经从应用程序结构中删除的默认脚手架创建的 /home 。同样适用于其他用户角色eg; from localhost/agent to localhost/supplier, from localhost/moderator to localhost/admin, etc.
我在这里想念什么?
请注意,几周前我开始使用 laravel 并仍在尝试解决问题...
解决方案
的中间件RedirectIfAuthenticated
负责重定向当前在站点中经过身份验证的用户。
如果您使用 laravel/ui ,您应该在redirectTo
方法中应用您的逻辑App\Http\Controllers\Auth\LoginController
推荐阅读
- bazel - 即使存在,也无法找到“datagen”文件夹和 BUILD 文件
- html - 如何在css中选择彼此相邻的特定元素
- sql-server - 有没有办法在带有条件的 INSERT INTO 子句中选择一个表?
- python - 如何将 OpenCv 图像从网络摄像头流式传输到 http 服务器
- java - JNI Linux 分段错误
- c++ - 二维容器的通用打印
- c - 获取结构的用户输入的问题
- r - 如何在列表中粘贴对象的完整位置 (r)
- python - ValueError:具有多个元素的数组的真值不明确...与无比较
- bluetooth-lowenergy - 定时发出 C++/winRT BLE 连接尝试?