【发布时间】:2017-10-11 03:00:18
【问题描述】:
我正在使用Laravel 5.4 和Vuejs 2.3 以及VueRouter
我的网站由两部分组成
- example.com
- example.com/tools
为了解释,我们将确定两种用户:
-
user->public_only = true的公共用户 - 统计用户
user->stats_only = true - 未登录的访客用户
这是我试图实现的目标
example.com 只能由public user 或guest user 访问。也就是说,如果一个用户已经登录为stat user,我想在到达页面/之前logout这个用户
example.com/tools 只能由stats user 访问。也就是说,如果用户已经登录为public user或者是guest user,我想在到达/tools页面之前将用户重定向到登录页面。
为此,我创建了两个中间件checkUserStats 和checkUsersPublic
一切运行良好。当我是public user 或想要访问/tools 的guest user 时,我正在获取登录页面。
当我是想要访问/ 的stats user 时,我正在注销并重定向到主页。
问题
当我是public user 或guest 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