首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >登录时,管理员和Manager用户被重定向到路由/home,但必须分别重定向到路由/ Admin /home和/manager/home

登录时,管理员和Manager用户被重定向到路由/home,但必须分别重定向到路由/ Admin /home和/manager/home
EN

Stack Overflow用户
提问于 2022-10-07 14:33:30
回答 2查看 78关注 0票数 0

我正在学习多重认证。

特别是我有3个用户:

/manager/home

  1. :在登录
  2. 时必须重定向到/home用户管理<代码>E29用户,必须重定向到E 110/admin/homeE 211当登录H 212H 113aE 114/code>ManagerE 215用户,必须重定向到H 218G 219中的用户。

我遇到的问题是,当我作为管理员和管理员登录时,我被重定向到路由/home,然后得到错误

“您没有访问此页面的权限。”

然而,一旦我登录,如果我手动输入感兴趣的路由,我可以登录没有问题。

因此,问题在于,一旦我尝试以管理员或Manager身份登录时,路径就会寻址。对于用户用户,我没有任何问题。

这是我的密码:

Route.php

代码语言:javascript
复制
Route::get('/', function () {
    return view('welcome');
});
  
Auth::routes();
  
/*------------------------------------------
--------------------------------------------
All Normal Users Routes List
--------------------------------------------
--------------------------------------------*/
Route::middleware(['auth', 'user-access:user'])->group(function () {
  
    Route::get('/home', [HomeController::class, 'index'])->name('home');
});
  
/*------------------------------------------
--------------------------------------------
All Admin Routes List
--------------------------------------------
--------------------------------------------*/
Route::middleware(['auth', 'user-access:admin'])->group(function () {
  
    Route::get('/admin/home', [HomeController::class, 'adminHome'])->name('admin.home');
    Route::get('/admin/link', [HomeController::class, 'adminHello'])->name('admin.hello');
    
});
  
/*------------------------------------------
--------------------------------------------
All Admin Routes List
--------------------------------------------
--------------------------------------------*/
Route::middleware(['auth', 'user-access:manager'])->group(function () {
  
    Route::get('/manager/home', [HomeController::class, 'managerHome'])->name('manager.home');
});

LoginController

代码语言:javascript
复制
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 = RouteServiceProvider::HOME;
  
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
 
    public function login(Request $request)
    {   
        $input = $request->all();
     
        $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required',
        ]);
     
        if(auth()->attempt(array('email' => $input['email'], 'password' => $input['password'])))
        {
            if (auth()->user()->type == 'admin') {
                return redirect()->route('admin.home');
            }else if (auth()->user()->type == 'manager') {
                return redirect()->route('manager.home');
            }else{
                return redirect()->route('home');
            }
        }else{
            return redirect()->route('login')
                ->with('error','Email-Address And Password Are Wrong.');
        }
          
    }
}

HomeController

代码语言:javascript
复制
<?php
  
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
  
class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }
  
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        return view('home');
    } 
  
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function adminHome()
    {
        return view('adminHome');
    }
  
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function managerHome()
    {
        return view('managerHome');
    }
}

UserAccess

代码语言:javascript
复制
<?php
  
namespace App\Http\Middleware;
  
use Closure;
use Illuminate\Http\Request;
  
class UserAccess
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next, $userType)
    {
        if(auth()->user()->type == $userType){
            return $next($request);
        }
          
        return response()->json(['You do not have permission to access for this page.']);
        /* return response()->view('errors.check-permission'); */
    }
}

你能帮帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2022-10-07 14:46:23

在我的大多数应用程序中,我都有一个管理面板。下面是我如何实现重定向逻辑:

我在轻松安装中使用了默认的Auth/AuthenticatedSessionController类。

我的存储方法如下所示:

代码语言:javascript
复制
public function store(LoginRequest $request)
{
    $request->authenticate();

    $request->session()->regenerate();

    if (Auth::user()->hasRole('admin')) {
        return redirect()->intended(RouteServiceProvider::ADMIN_HOME);
    }

    return redirect()->intended(RouteServiceProvider::HOME);
}

当然,在RouteServiceProvider中,我已经定义了我的路线:

代码语言:javascript
复制
public const HOME = '/myorders';

public const ADMIN_HOME = '/admin/pages';
票数 0
EN

Stack Overflow用户

发布于 2022-10-07 17:42:55

解决方案1:

在您的App\Http\Controllers\Auth\LoginController上,只需重写方法:

代码语言:javascript
复制
use Illuminate\Support\Facades\Auth;

public function redirectPath()
{
    if (Auth::user()->role == 'Admin') {
        return "/admin/home";
        // or return route('admin.home');
    } 
    elseif (Auth::user()->role == 'Manager') {
        return "/manager/home";
        // or return route('manager.home');
    }

    return "/home";
    // or return route('home');
}

注:如果方法redirectPath出现问题,请尝试使用redirectTo方法。还必须删除名为redirectTo的属性。

解决方案2:

App\Http\Controllers\Auth\LoginController.php

代码语言:javascript
复制
use Illuminate\Support\Facades\Auth;

protected function authenticated(Request $request, $user)
{
    if (auth()->user()->hasRole(['Admin'])) {
        return redirect("/admin/home");
    } 
    elseif (auth()->user()->hasRole(['Manager'])) {
        return redirect("/manager/home");
    }

    return redirect("/home");
}

注:如果您使用的是Laravel Spatie Permission包,那么权限检查将以这种方式工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73988765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档