Laravel - 路由和中间件与 VueRouter 之间的混淆
Laravel - Confusion between routes and middleware and VueRouter
我正在使用 Laravel 5.4
和 Vuejs 2.3
以及 VueRouter
我有一个由两部分组成的网站
- example.com
- 示例。com/tools
为了解释我们将确定两种用户:
- Public 用户
user->public_only = true
- Stats 用户
user->stats_only = true
- 未登录的访客用户
这是我努力实现的目标
example.com
应该只能由 public user
或 guest user
访问。也就是说,如果用户已经登录为 stat user
,我想在到达页面 /
之前 logout
用户
example.com/tools
应该只能由 stats user
访问。也就是说,如果用户已经登录为 public user
或者是 guest user
,我想在到达页面 /tools
.[=52 之前将用户重定向到登录页面=]
为此,我创建了两个中间件 checkUserStats
和 checkUsersPublic
一切正常。当我是 public user
或 guest user
想要访问 /tools
时,我正在获取登录页面。
当我是 stats user
想访问 /
时,我正在注销并重定向到主页。
问题
当我是 public user
或 guest 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
处理它。
我正在使用 Laravel 5.4
和 Vuejs 2.3
以及 VueRouter
我有一个由两部分组成的网站
- example.com
- 示例。com/tools
为了解释我们将确定两种用户:
- Public 用户
user->public_only = true
- Stats 用户
user->stats_only = true
- 未登录的访客用户
这是我努力实现的目标
example.com
应该只能由 public user
或 guest user
访问。也就是说,如果用户已经登录为 stat user
,我想在到达页面 /
logout
用户
example.com/tools
应该只能由 stats user
访问。也就是说,如果用户已经登录为 public user
或者是 guest user
,我想在到达页面 /tools
.[=52 之前将用户重定向到登录页面=]
为此,我创建了两个中间件 checkUserStats
和 checkUsersPublic
一切正常。当我是 public user
或 guest user
想要访问 /tools
时,我正在获取登录页面。
当我是 stats user
想访问 /
时,我正在注销并重定向到主页。
问题
当我是 public user
或 guest 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
处理它。