在 Laravel 中使用 auth 保护所有管理员/路由
Posted
技术标签:
【中文标题】在 Laravel 中使用 auth 保护所有管理员/路由【英文标题】:Protecting all admin/ routes with auth in Laravel 【发布时间】:2013-03-27 05:35:29 【问题描述】:我是 laravel 的新手,正在我的第一个应用程序上设置管理面板授权。我当前设置文件的方式是:
controllers/
admin/
dashboard.php
settings.php
non-admin-controller1.php
non-admin-controller1.php
views/
admin/
dashboard.blade.php
login.blade.php
template.blade.php
non-admin-view1.php
non-admin-view1.php
non-admin-view1.php
...这些是我的路线
Route::get('admin/login', function()
return View::make('admin.login');
);
Route::get('admin/logout', function()
return Auth::logout();
return Redirect::to('admin/login');
);
Route::post('admin/login', function()
$userdata = array('username' => Input::get('username'),
'password' => Input::get('password'));
if (Auth::attempt($userdata))
return Redirect::to('admin');
else
return Redirect::to('admin/login')->with('login_errors',true);
);
Route::controller('admin.dashboard');
Route::get('admin', array('before' => 'auth', function()
return Redirect::to_action('admin@dashboard');
));
Route::filter('auth', function()
if (Auth::guest()) return Redirect::to('admin/login');
);
当我转到 /admin 时,我被重定向到 admin/login 并要求登录,这正是我需要它工作的方式。登录后,我被重定向到管理员/仪表板,那里看起来也很好。但是我有两个问题。
当我进入 admin/logout 时,我已注销但看到一个空白页面(它没有重定向到 admin/login)
注销后,如果我转到管理/仪表板,我会收到错误提示
错误渲染视图:[admin.dashboard]
试图获取非对象的属性
我在这里做错了什么?我做对了什么?为管理员创建一个单独的捆绑包更有意义吗?谢谢!
【问题讨论】:
【参考方案1】:对于未来的读者来说,处理这个问题的一种非常简洁的方法是使用 Laravel 的 Route Groups:
路由组允许您跨大量路由共享路由属性,例如中间件或命名空间,而无需在每个单独的路由上定义这些属性。
Route::group(['middleware' => 'auth'], function ()
Route::get('/', function ()
// Uses Auth Middleware
);
Route::get('user/profile', function ()
// Uses Auth Middleware
);
);
它们不仅可以用于身份验证,还可以用于Namespaces
、Sub-Domains
等。
【讨论】:
【参考方案2】:所以我能够以稍微不同的方式解决我的问题。我在控制器文件夹的根目录中创建了一个(基本)Admin_Controller,并在执行前调用了 auth 过滤器的构造函数:
class Admin_Controller extends Base_Controller
public function __construct()
$this->filter('before', 'auth');
然后让我在 /controllers/admin 中的所有与管理相关的控制器扩展 Admin_Controller 并调用父构造函数:
class Admin_Dashboard_Controller extends Admin_Controller
public function __construct()
parent::__construct();
public function action_index()
return View::make('admin.dashboard');
这可能不是最有说服力的解决方案,但它确实有效!
【讨论】:
【参考方案3】:在您的admin/login
路由中,您在Auth::logout()
调用之前有一个不必要的返回,核对它应该修复它。
这里的另一个问题是只有您的一个“管理员”路由被过滤。您可以使用Route::group()
包装所有管理路由并在过滤器之前应用“auth”,或者您也可以使用Route::filter('pattern: admin/*', 'auth')
。
退房:
http://laravel.com/docs/routing#filters
对于第二个问题,您的 Admin Dashboard 控制器类是否名为 Admin_Dashboard_Controller
,如果是,您是否有 action_index() 或 get_index() 函数在其中返回视图?
退房:
http://laravel.com/docs/controllers#nested-controllers
(顺便说一句,我假设您在这里使用的是 L3。)
【讨论】:
感谢@Darren Monahan 的回答!是的,我正在使用 L3。你指的是Route::get('admin/login', function() return View::make('admin.login'); );
吗?我尝试删除它并遇到 404 错误,因为我目前没有带有登录方法的管理类。我尝试了Route::filter('pattern: admin/*', 'auth')
,但陷入了重定向循环。我有一个 Admin_Dashboard_Controller 看起来像这样 class Admin_Dashboard_Controller extends Base_Controller public function action_index() return View::make('admin.dashboard')->with('menu_active','dashboard');
请忽略我评论的第一部分,我明白你的意思并修复它:return Auth::logout();
:)
我尝试了 Route::filter('pattern: admin/*', 'auth') 但陷入了重定向循环。看起来 Filter 在 Base 控制器构造方法之前被调用。所以,我不能为登录索引页面做异常。以上是关于在 Laravel 中使用 auth 保护所有管理员/路由的主要内容,如果未能解决你的问题,请参考以下文章