首页 > 解决方案 > Laravel 用户基于角色登录到不同的主页

问题描述

情景

我有一个简单的应用程序,它有四个主要用户角色。

如上所述,每个角色都有一个单独的控制器中间件。每个控制器都有 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 并仍在尝试解决问题...

标签: phplaravelauthenticationuser-roles

解决方案


的中间件RedirectIfAuthenticated负责重定向当前在站点中经过身份验证的用户。

如果您使用 laravel/ui ,您应该在redirectTo方法中应用您的逻辑App\Http\Controllers\Auth\LoginController


推荐阅读