繁体   English   中英

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

[英]Protecting all admin/ routes with auth in Laravel

我是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. 注销后,如果我转到管理员/仪表板,我会遇到错误

渲染视图出错:[admin.dashboard]

试图获得非对象的属性

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

所以我能够以稍微不同的方式解决我的问题。 我在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');
    }

}

这可能不是最有说服力的解决方案,但它可以完成这项工作!

在您的admin/login路由中,您在Auth::logout()调用之前有一个不必要的返回,nuke,它应该修复它。

这里的另一个问题是只有你的一个“管理员”路线被过滤掉了。 您可以使用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顺便说一句。)

对于未来的读者来说,一个非常干净的方法是使用Laravel的路由组

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM