【问题标题】:Laravel - Confusion between routes and middleware and VueRouterLaravel - 路由和中间件与 VueRouter 之间的混淆
【发布时间】:2017-10-11 03:00:18
【问题描述】:

我正在使用Laravel 5.4Vuejs 2.3 以及VueRouter

我的网站由两部分组成

  1. example.com
  2. example.com/tools

为了解释,我们将确定两种用户:

  1. user->public_only = true 的公共用户
  2. 统计用户user->stats_only = true
  3. 未登录的访客用户

这是我试图实现的目标

example.com 只能由public userguest user 访问。也就是说,如果一个用户已经登录为stat user,我想在到达页面/之前logout这个用户

example.com/tools 只能由stats user 访问。也就是说,如果用户已经登录为public user或者是guest user,我想在到达/tools页面之前将用户重定向到登录页面。

为此,我创建了两个中间件checkUserStatscheckUsersPublic

一切运行良好。当我是public user 或想要访问/toolsguest user 时,我正在获取登录页面。 当我是想要访问/stats user 时,我正在注销并重定向到主页。


问题

当我是public userguest user 并想访问/tools 时,我将获得登录页面。当我填写“登录”页面时,我正在访问example.com/tools,这很好。

但如果刷新页面,我会再次重定向到login 页面。我设法弄清楚刷新页面时,代码在获得'StatsController@home'之前经过HomeController@home。所以它进入了checkUsersPublic 的低谷,因为我不是public user,所以我正在逻辑上注销。

问题

当我在这里 example.com/tools 并且我正在刷新页面时,我怎么能这样做?我不是首先被重定向到 / 而是直接重定向到 /tools

是否有另一种方法来实现我正在尝试做的事情来解决这个问题?




Laravel 中的路由

Route::get('/', 'HomeController@home');
Route::get('/tools', 'StatsController@home');

Vue 路由器

const routes = [
    { path: '/', component: App },
    { path: '/tools', component: Stats },
];

家庭控制器

class HomeController extends Controller
{

    public function __construct()
    {
        $this->middleware('checkUsersPublic');
    }

    public function home()
    {
        return view('app');
    }
}

统计控制器

class StatsController extends Controller
{

    public function __construct()
    {
        $this->middleware('checkUsersStats');
    }

    public function home()
    {
        return view('app');
    }
}

中间件检查用户公共

class checkUsersPublic
{
    public function handle($request, Closure $next)
    {
        if(auth()->check() && auth()->user()->public_only) {
            return $next($request);
        }
        if(Auth::check()) {Auth::logout();}
        return $next($request);
    }
}

中间件检查用户公共

class checkUsersStats
{
    public function handle($request, Closure $next)
    {
        if(auth()->check() && auth()->user()->stats_only) {
            return $next($request);
        }

        if(Auth::check()) {Auth::logout();}
        return redirect()->guest('login');
    }
}

【问题讨论】:

    标签: php laravel laravel-5 routes middleware


    【解决方案1】:

    我通过简化问题解决了这个问题。在本主题中进行了说明

    Laravel - Middleware triggered while it should not?.

    基本上不用 Laravel 做中间件,你需要让 vue-router 处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 2016-05-03
      • 1970-01-01
      • 2017-05-19
      • 2015-09-28
      • 2020-12-09
      • 2016-09-22
      • 2015-06-01
      相关资源
      最近更新 更多