【发布时间】:2018-07-13 18:06:36
【问题描述】:
出于绝对测试目的(这可能不是我将在我的代码上保留的一致行为)我尝试使用带有 .env 文件的自定义管理面板路由设置(因为它似乎与保护整个事情有关,但不是所以确定了)。
因为我希望访问该站点的人可以在访客模式下看到管理面板,所以我认为设置一个重新路由中间件会很酷,该中间件只需在 .env 设置管理路由之后放置一个访客。尝试访问 /admin/jobs 的访客将在 /admin/guest/jobs 以降低的权限控制器结束。
下面的代码在没有 .env 的情况下可以正常工作。
在\Route\web.php中是这样设置的
Route::namespace('Admin')->middleware('auth')->group(function () {
$adminRoute = config('app.admin-route');
$adminRoute = (preg_match('/[\/].*/', $adminRoute)) ? $adminRoute : '/' . $adminRoute;
Route::middleware('isadmin')->group(function () use ($adminRoute) {
Route::get($adminRoute, 'AdminController@index')->name('adminPanel');
Route::get($adminRoute . '/test', function () {
echo 'test';
});
});
Route::get($adminRoute . '/guest/{where?}', 'AdminController@guest')->where('where', '.*')->name('adminAsGuest');
});
以及对应的isAdmin中间件:
public function handle($request, Closure $next)
{
$adminRoute = config('app.admin-route');
$adminRoute = (preg_match('/\/.*/', $adminRoute)) ? $adminRoute : '/' . $adminRoute;
// check if authentified
if (Auth::check())
{
// check if admin
if (Auth::user()->role == 1) {
return $next($request);
}
else
{
$route = "/".$request->route()->uri;
// check if route exists
if (Route::has($route)) {
// trim the route after admin and puts a guest inside
$redirect = preg_replace("/\\".$adminRoute."/", "", $route);
return redirect($adminRoute . '\/guest/' . $redirect);
}
else {
// if it doesn't, let it go to the laravel error
return $next($request);
}
}
}
// if auth middleware was used on same route, won't go there anyways
// if not, redirect to root route
return redirect('/');
}
只要我使用 env("APP_ADMIN_ROUTE") 作为管理路由的根目录,Route::has($route) 就无法正确触发,因此我正处于挣扎之中。
这是我在if (Route::has($route)) 之前的调试输出
Auth::check()
true
Auth::user()->role
0
$route
"/admin/test"
Route::has($route);
false
vagrant@ubuntu-xenial:/var/www/html$ wphp artisan route:list
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+------------------+
| | GET|HEAD | / | | App\Http\Controllers\WelcomeController@index | web |
| | GET|HEAD | admin | adminPanel | App\Http\Controllers\Admin\AdminController@index | web,auth,isadmin |
| | GET|HEAD | admin/guest/{where?} | adminAsGuest | App\Http\Controllers\Admin\AdminController@guest | web,auth |
| | GET|HEAD | admin/test | | Closure | web,auth,isadmin |
我知道使用管理员控制器肯定会更加一致,在这些控制器中,我不断跟踪所连接用户的角色,并授予或不授予修改内容的权利。但我真的很想知道是否有任何可能的方法来像我在这里尝试过的那样工作。
我见过Zizaco/entrust,它肯定会在更简单的方法上工作得很好,如果我当前的问题没有积极的答案,这是我的下一步:)
这是我关于 StackOverflow 的第一个问题。我对那个精确的东西进行了很好的搜索,但没有成功。如果我在某处遗漏了明显的答案,我深表歉意。
编辑:根据 Joel Hinz 的评论更新了代码。
// \Config\app.php
'admin-route' => env('APP_ADMIN_ROUTE', 'admin'),
【问题讨论】:
-
哦,我现在很困惑。昨天在没有 env 的情况下工作,所以我把它反转了,我无法让它再次工作。 Route::has() 似乎适用于路由名称而不是 URI。我会以这种方式进行调查并与laracasts.com/discuss/channels/general-discussion/…核对
标签: php laravel routes middleware