Laravel - 路由和中间件与 VueRouter 之间的混淆

Laravel - Confusion between routes and middleware and VueRouter

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

我有一个由两部分组成的网站

  1. example.com
  2. 示例。com/tools

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

  1. Public 用户 user->public_only = true
  2. Stats 用户 user->stats_only = true
  3. 未登录的访客用户

这是我努力实现的目标

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

之前 logout 用户

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

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

一切正常。当我是 public userguest user 想要访问 /tools 时,我正在获取登录页面。 当我是 stats user 想访问 / 时,我正在注销并重定向到主页。


问题

当我是 public userguest user 想要访问 /tools 时,我正在获取登录页面。当我填写 'login' 页面时,我正在访问很好的 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');
    }
}

中间件检查用户Public

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);
    }
}

中间件检查用户Public

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');
    }
}

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

.

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