【问题标题】:Laravel: How to redirect to page depends on roleLaravel:如何重定向到页面取决于角色
【发布时间】:2017-10-28 10:41:36
【问题描述】:

我有 2 种登录类型,管理员和客户。 如果想使用管理员凭据登录客户仪表板,它不会登录,这就是我想要的,但是如果我使用客户凭据登录会将我重定向到客户仪表板,但如果我想同时打开管理仪表板,它将重定向我进入管理仪表板而不检查角色 id,角色 id 必须是 1 而不是 2,如下代码所示:

管理员:Dashboard\LoginController

public function postLogin(request $request){
    $auth=auth::guard('web')->attempt(['email'=>$request->email,'password'=>$request->password,'active'=>1,'role_id'=>1]);
    if($auth)
    {
        return redirect()->route('dashboard');
    }
    return view('Dashboard.login');
}


public function getLogin(){
    if(Auth::guard('web')->check()){
        return redirect()->route('dashboard');
    }
    return view('Dashboard.login');
}

客户:customer\LoginController

public function postLogin(request $request){
    $auth=auth::guard('web')->attempt(['email'=>$request->email,'password'=>$request->password,'active'=>1,'role_id'=>2]);
    if($auth)
    {
        return redirect()->route('customer');
    }
    return redirect()->route('/');
}

public function getLogin(){
    if(Auth::guard('web')->check()){
        return redirect()->route('customer');
    }
    return view('index.mainpage.home');
}

【问题讨论】:

标签: php laravel


【解决方案1】:

在我看来,它应该只在身份验证完成后处理,然后应用程序决定根据其角色将用户重定向到正确的路由:)

这只是一次检查,而不是每个请求检查>>这是中间件的工作。

AuthenticatesUsers trait 内部有一个名为authenticated 的方法,带有protected function authenticated(Request $request, $user) 签名,您可以在LoginController 内部覆盖它。您可以检查用户的角色,然后将他重定向到正确的位置。

举个例子:

/**
 * The user has been authenticated.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  mixed  $user
 * @return mixed
 */
protected function authenticated(Request $request, $user)
{
    if ($user->hasRole('admin')) {
        return redirect('/admin');
    } else {
        return redirect('/');
    }
}

更新

我们有两种情况(据我所知):

场景 1:用户(任何类型)登录网站,我们希望将他重定向到相应的面板(例如,如果他具有管理员角色,则将他重定向到管理员面板)。

场景 2:如果普通用户访问/admin,我们希望阻止他访问管理面板并重定向回主页或面对403 Forbidden 错误页面。

在第一种情况下,您可以通过检查用户的角色(我在上面解释过)从 LoginController 重定向用户。

其次,您需要一个用于管理路由组的中间件,用于检查用户的角色,如果不是管理员用户,则重定向他或中止它。

【讨论】:

  • 不明白我是 laravel 的新手 :(
  • @GhadahSalman 你在App\Http\Controllers\Auth里面找到LoginController了吗?
  • 是的,它只有这个功能:protected $redirectTo = '/home'; /** * 创建一个新的控制器实例。 * * @return void */ public function __construct() { $this->middleware('guest',['except'->'logout']); } }
  • 已在 AuthenticatesUsers.php 中找到经过身份验证的函数
  • 已在 AuthenticatesUsers.php 中找到经过身份验证的函数
【解决方案2】:

在刚刚添加的AdminController中

$this->中间件('auth:admin');

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 2018-01-24
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2019-12-12
    • 2010-12-03
    相关资源
    最近更新 更多