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

时间:2017-05-11 22:44:12

标签: php laravel laravel-5 routes middleware

我使用Laravel 5.4Vuejs 2.3以及VueRouter

我的网站分为两部分

  1. example.com
  2. example.com/tools
  3. 为了解释,我们将确定两种用户:

    1. user->public_only = true
    2. 的公共用户
    3. user->stats_only = true
    4. 的统计用户
    5. 未登录的访客用户
    6. 这是我试图实现的目标

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

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

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

      一切都很顺利。当我想要public userguest user想要访问/tools时,我会获得登录页面。 当我stats user想要访问/时,我正在退出,并且我正在重定向到主页。

      问题

      当我想要public userguest user想要访问/tools时,我会获得登录页面。当我填写“登录”时第I页访问example.com/tools,这是好的。

      但是,如果刷新页面,我会再次重定向到login页面。我设法弄清楚,在刷新页面时,代码会在获得HomeController@home之前通过'StatsController@home'。因此,它已经过checkUsersPublic而我已经逻辑退出,因为我不是public user

      问题

      当我在example.com/tools时我怎么能这样做?我刷新页面时我没有先被重定向到/而是被重定向到{{1}直接?

      还有另一种方法可以实现我试图解决此问题的方法吗?

      Laravel的路线

      /tools

      Vue路由器

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

      的HomeController

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

      StatsController

      class HomeController extends Controller
      {
      
          public function __construct()
          {
              $this->middleware('checkUsersPublic');
          }
      
          public function home()
          {
              return view('app');
          }
      }
      

      Middleware checkUsersPublic

      class StatsController extends Controller
      {
      
          public function __construct()
          {
              $this->middleware('checkUsersStats');
          }
      
          public function home()
          {
              return view('app');
          }
      }
      

      Middleware checkUsersPublic

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

1 个答案:

答案 0 :(得分:0)

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

Laravel - Middleware triggered while it should not?

基本上不是用Laravel做中间件,而是让vue-router处理它。