如何同时使用 Laravel 认证和 vue-router

Posted

技术标签:

【中文标题】如何同时使用 Laravel 认证和 vue-router【英文标题】:How to use Laravel authentication and vue-router together 【发布时间】:2019-08-14 13:08:15 【问题描述】:

我是 Laravel 和 php 的新手,但熟悉 Vue 和 SPA。例如,我知道如何使用 Bcrypt 创建身份验证。但是,我使用 Laravel 运行 php artisan make:auth 并为后端创建了几个不同的端点。

我试图使用 Vue 将我的应用程序转换为 SPA,但是在 Vue 中使用路由会导致 web.php 中定义的路由出现问题。例如,我有这样的 web.php,有几个不同的路由。

<?php

Route::get('/vue_capture?', function () 
    return view('app');
 )->where('vue_capture', '^(?!storage).*$'); 

Route::get('/', function () 
    return view('app');
);
Route::resource('Videos', 'VideoController')->middleware('auth','isAdmin');
Route::resource('Categories', 'CategoriesController')->middleware('auth');
Route::get('/search', 'VideoController@search')->middleware('auth');

Auth::routes();

Route::get('/settings/account', 'AccountsController@edit')->middleware('auth');
Route::get('/auth', 'AccountsController@get');
Route::put('/settings/account', 'AccountsController@update')->middleware('auth');

但是,我还有一个 routes.js 让 vue-router 使用以下内容处理路由:

import Home from './components/Home.vue'
import Videos from './components/Videos.vue'
import Categories from './components/Categories.vue'

export default
    mode: 'history',


    routes: [
        
            path:'/',
            component:Home
        ,

        
            path:'/Videos',
            component:Videos
        ,
        
            path:'/Categories',
            component:Categories
        ,
        
            path:'/login',
            component:login
        ,
        
            path:'/register',
            component:register
        ,
        
            path:'/logout',
            component:logout
        
    ]

我知道如果您使用 SPA,Vue 应该接管路由,但是有什么方法可以同时使用这两者吗?我找不到任何可以解决这个问题的东西,但我不相信 Laravel 会让你选择使用他们的内置命令,比如 php artisan make:auth,或者如果你想要一个必须放弃所有这些并手动完成所有操作带有路由的 SPA。

我尝试过使用 Laravel 和/或 Vue 的不同 CRUD 教程。 我尝试将所有路由定向到 Vue 以让 vue-router 处理路由。 我尝试不将所有路由都提供给 vue-router 并保留我在 web.php 中拥有的后端路由

其他半相关的问题是我的路线甚至没有显示为使用 router-link 的链接。它只是显示为普通文本。但目前我的首要任务是路由问题。

【问题讨论】:

【参考方案1】:

你可以结合 vue 路由和 Laravel 路由。但为了获得最佳效果,我建议您使用 vue 路由器,因为您正在构建一个水疗中心。

    删除
Route::get('/', function () 
    return view('app');
);
    将所有后端路由放在指向您的 vue 的路由之前。
Route::resource('Videos', 'VideoController')->middleware('auth','isAdmin');
Route::resource('Categories', 'CategoriesController')->middleware('auth');
Route::get('/search', 'VideoController@search')->middleware('auth');

Auth::routes();

Route::get('/settings/account', 'AccountsController@edit')->middleware('auth');
Route::get('/auth', 'AccountsController@get');
Route::put('/settings/account', 'AccountsController@update')->middleware('auth');

Route::get('/vue_capture?', function () 
    return view('app');
 )->where('vue_capture', '^(?!storage).*$'); 

另外,验证您的后端(运行 php artisan route:list 以查看您的 laravel 路由列表)和 vue 路由没有冲突的路由。我希望这会有所帮助。

【讨论】:

【参考方案2】:

接受的答案是完美的(我投票了,但我还没有代表可以计算)并且对我来说效果很好,但前提是我还创建了“虚拟”vue 组件并将它们导入以与路线一起使用。希望这会有所帮助!

import Login from './auth/Login'
import Register from './auth/Register'
import Logout from './auth/Logout'

 path:'/login', component:Login ,
 path:'/register', component:Register ,
 path:'/logout', component:Logout ,

【讨论】:

【参考方案3】:

你可以改用这个

Route::get('/vue_capture?', function () 
    return view('app');
 )->where('vue_capture', '^(?!storage).*$')->middleware('auth');

【讨论】:

以上是关于如何同时使用 Laravel 认证和 vue-router的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中间件 API 认证

使用 Laravel JWT 重新认证时将旧令牌列入黑名单

Laravel 5.4建站06--API 认证系统 Passport

如何在 laravel 项目中同时使用 web 的守卫和 api 的守卫?

Laravel 多重保护认证失败

3 级认证/中间件 Laravel