Защита всех админов/маршрутов с помощью auth в 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('[email protected]');
}));

Route::filter('auth', function()
{
    if (Auth::guest()) return Redirect::to('admin/login');
});

Когда я перехожу в /admin, я перенаправляюсь в admin/login и прошу войти в систему, что именно так мне нужно для работы. При входе в систему я перенаправляется на admin/dashboard, и все выглядит хорошо там. Однако у меня есть 2 проблемы.

  • Когда я иду в admin/logout, я выхожу из системы, но приветствую пустую страницу (она не перенаправляется на admin/login)

  • При выходе из системы, если я иду на admin/dashboard, меня приветствует ошибка

Просмотр рендеринга ошибок: [admin.dashboard]

Попытка получить свойство не-объекта

Что я здесь делаю неправильно? Что я делаю правильно? Будет ли смысл создавать отдельный пул для администратора? Спасибо!

Ответ 1

Итак, я смог решить свою проблему несколько иначе. Я создал (базовый) Admin_Controller в корневой папке контроллеров с конструктором, вызывающим фильтр авторизации перед выполнением:

class Admin_Controller extends Base_Controller {

    public function __construct()
    {
        $this->filter('before', 'auth');
    }

}

а затем все мои контроллеры, связанные с администратором, в /controller/admin расширяют Admin_Controller и вызывают родительский конструктор:

class Admin_Dashboard_Controller extends Admin_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    public function action_index()
    {
        return View::make('admin.dashboard');
    }

}

Это может быть не самое красноречивое решение, но оно выполняет эту работу!

Ответ 2

На вашем трассе admin/login у вас есть ненужное возвращение перед вызовом Auth::logout(), nuke, и он должен его исправить.

Еще одна проблема заключается в том, что только ваш "админ" маршрут фильтруется. Вы можете перенести все свои маршруты администратора с помощью Route::group() и применить фильтр "auth" перед фильтром, или вы также можете использовать Route::filter('pattern: admin/*', 'auth').

Отъезд:

http://laravel.com/docs/routing#filters

Для второй проблемы ваш класс контроллера панели управления с именем Admin_Dashboard_Controller, и если да, то у вас есть функция action_index() или get_index(), возвращающая представление?

Отъезд:

http://laravel.com/docs/controllers#nested-controllers

(Я предполагаю, что вы используете L3 здесь, btw.)

Ответ 3

Для будущих читателей очень чистый способ справиться с этим - использовать Laravel Группы маршрутов:

Группы маршрутов позволяют распределять атрибуты маршрута, такие как промежуточное ПО или пространства имен, на большом количестве маршрутов, не требуя определения этих атрибутов на каждом отдельном маршруте.

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

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

Они могут использоваться не только для аутентификации, но также Namespaces, Sub-Domains и т.д.