我正在开发一个仅供后端管理员使用的Laravel项目。因此,“标准用户”和“管理员用户”没有分离。所以,我想在整个项目中实现某种全局身份验证过滤器。
目前我所拥有的是 app / routes.php
<?php
// Home route with login required
Route::get('/', array('as' => 'home', function () {
return View::make('hello');
}))->before('auth');
/*
* Global Auth Filter - All Guests Go To Login
*/
Route::filter('auth', function($route, $request) {
if (Auth::guest())
return Redirect::guest('login')
->with('login_error', 'Login required!');
});
/*
* Login Route Handler
*/
Route::get('login', array('as' => 'login', function () {
if (Auth::check())
return Redirect::route('home');
return View::make('login');
}))->before('guest');
/*
* Login Post Event Handler
*/
Route::post('login', function ()
{
// Parse form data
$user = array(
'username' => Input::get('username'),
'password' => Input::get('password')
);
// Try to login user
if (Auth::attempt($user))
{
// login success
return Redirect::route('home');
}
else
{
// Login error
return Redirect::route('login')
->withInput()
->with('login_error', 'Invalid username and/or password!');
}
});
/*
* Logout Route Handler
*/
Route::get('logout', array('as' => 'logout', function () {
Session::flush();
return Redirect::route('home');
}))->before('auth');
这很好用。如果我到了/
页面,它会将我重定向到/login
路由,然后我可以登录。登录后,我在/logout
视图上有一个hello
链接,该链接也有效(即退出)。
以上代码是我的测试代码。在我正在处理的实际应用程序中(接管前一个开发人员的项目),路径 app / routes.php 的设置如下:
<?php
Route::controller('dev', 'DevController');
Route::controller('orders', 'OrdersController');
Route::controller('customers', 'CustomersController');
Route::controller('picking', 'PickingController');
Route::controller('stock', 'StockController');
Route::controller('suppliers', 'SuppliersController');
Route::controller('warehouse', 'WarehouseController');
Route::controller('upload', 'UploadController');
Route::controller('apixero', 'XeroController');
Route::controller('api/orders', 'OrdersAPIController');
Route::controller('api/picking', 'PickingAPIController');
Route::controller('api/po', 'PurchaseOrdersAPIController');
Route::controller('api/products', 'ProductsAPIController');
Route::controller('api/customer', 'CustomerAPIController');
Route::controller('api/suppliers', 'SuppliersAPIController');
Route::controller('api/currency', 'CurrencyAPIController');
Route::controller('api/notes', 'NotesAPIController');
Route::get('/', function() {
return View::make('dashboard');
});
我的问题#1 是,如何对app/routes.php
的请求应用“全局”身份验证?由于真正的应用程序路由代码似乎与我在测试代码中编写的不同。
问题#2 - 查看我的测试代码,有人可以告诉我此过滤器将在何时执行:
Route::filter('auth', function($route, $request) { ... });
这个代码概念取自我正在阅读的教程,但我注意到我的test
代码仍然可以正常工作 - 即使我删除了这个代码块。因此,我不完全确定上述代码块正在执行的情况。
答案 0 :(得分:2)
在测试环境中禁用路由过滤器。要启用它们,请在测试中添加Route::enableFilters()
。
要添加全局身份验证过滤器,您可以这样做:
Route::get('/login')... //rest of code here
Route::get('logout')... //rest of code here
Route::group(array('before' => 'auth'), function()
{
Route::controller('dev', 'DevController');
Route::controller('orders', 'OrdersController');
...
Route::controller('api/notes', 'NotesAPIController');
Route::get('/', function() {
return View::make('dashboard');
});
});