【问题标题】:Use different controller for same route based on user role in Laravel根据 Laravel 中的用户角色对同一路由使用不同的控制器
【发布时间】:2019-08-07 03:52:07
【问题描述】:

我想要的是我可以根据登录用户的角色为相同的路由使用不同的控制器,所以如果用户以管理员角色登录,我希望给定 url 的控制器从 Admin 命名空间加载。我已经这样做了

Route::group(['middleware'=>['install','auth']],function(){

    $role = \Auth::user()->role;
    switch ($role)
    {
        case 'admin':
            $prefix = 'Admin\\';
            break;
        case 'Foo':
            $prefix = 'Foo\\';
            break;

    }
    Route::resource('/foo',$prefix.'FooController');
    //.......

但是据说 Auth::user() 为空,还有其他方法吗?

【问题讨论】:

  • 使用 Auth::check() 你可以检查是否有任何用户登录,而不是通过 Auth::User()->role use 可以获取用户的角色。确保你的使用模型扩展了 Authenticatable .

标签: php laravel


【解决方案1】:

您可以使用中间件为管理员或“Foo”执行重定向,只需检查身份验证角色并返回重定向到正确的路由。

class AdminOnly
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::user()->role != 'admin'){
            return redirect('path/to/non/admin/route');
        }

        return $next($request);
    }
}

然后在你的路由文件中定义两个路由,并使用中间件在它们之间重定向。

【讨论】:

  • 我不想在我的应用程序中做太多的重定向,我需要的是使用相同的 url 但不同的控制器由用户的角色决定
  • 有一个类似的问题stackoverflow.com/questions/38240330/… 有同样的问题。做你想做的事并不是最好的主意。如果控制器提供类似的页面,则使用中间件、门、守卫来过滤掉非管理员用户的内容。如果您提供的内容/页面非常不同,它们可能应该有不同的路线
【解决方案2】:

尝试auth()->user() 或包含特定的Auth 模块而不是\Auth::user(),这可能是解释器使用了错误的Auth 模块,因为其中有很多。

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 2023-03-25
    • 2021-07-12
    • 2013-09-24
    • 2016-03-29
    • 2020-10-09
    • 2016-03-03
    • 2019-07-18
    • 2015-08-12
    相关资源
    最近更新 更多