在Laravel中使用auth保护所有管理员/路由

时间:2013-04-04 22:56:34

标签: php authentication laravel laravel-3

我是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并要求登录,这正是我需要它工作的方式。登录后,我被重定向到管理员/仪表板,这一切看起来都很好。然而,我有两个问题。

  1. 当我进入管理/退出时,我已退出,但迎接了一个空白页面(它没有重定向到管理员/登录)

  2. 退出时,如果我转到管理员/信息中心,我会遇到错误

  3.   

    呈现视图时出错:[admin.dashboard]

         

    尝试获取非对象的属性

    我在这里做错了什么?我做得对吗?为管理员创建一个单独的包更合理吗?谢谢!

3 个答案:

答案 0 :(得分:10)

所以我能够以稍微不同的方式解决我的问题。我在controllers文件夹的根目录中创建了一个(基础)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');
    }

}

这可能不是最有说服力的解决方案,但它可以胜任!

答案 1 :(得分:9)

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。)

答案 2 :(得分:6)

对于未来的读者来说,使用Laravel的Route Groups

  

路由组允许您跨大量路由共享路由属性,例如中间件或命名空间,而无需在每条路径上定义这些属性。

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

它们不仅可用于身份验证,还可用于NamespacesSub-Domains等。