Пользовательский фильтр аутентификации Laravel

Я добавил стандартный фильтр авторизации к нескольким маршрутам, используя Route::Intended('/') в контроллере (при условии, что вход в систему выполнен успешно).

фильтры.php:

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

Контроллер:

if (Auth::attempt($data, false))
{
    return Redirect::intended('/');
}

Как мне создать собственный фильтр авторизации, который проверяет наличие определенного разрешения (в данном случае isAdmin)?

Я сделал фильтр auth.admin таким же, как стандартный фильтр авторизации, для перенаправления на страницу входа, но нужен ли мне второй метод входа в систему на моем контроллере или есть ли способ определить, какой фильтр (если есть) вызвал контроллер метод?

if (Auth::attempt($data, false))
{
    if (RouteHasAdminFilter())
    {
        if (!Auth::User()->Admin)
            return Redirect::intended('/');
        else
            return Redirect::to('/');
    }
    else
    {
        return Redirect::intended('/');
    }
}

person SteB    schedule 06.02.2014    source источник


Ответы (2)


Спасибо @diegofelix за то, что направил меня на правильный путь.

Мне удалось написать фильтр, который:

  • Запрашивает у пользователя свои учетные данные
  • Перенаправляет на домашнюю страницу для пользователей без прав администратора
  • Позволяет пользователю с правами администратора перейти к исходному URL-адресу


Route::filter('admin', function()  
{

    if (Auth::guest()) return Redirect::guest('internal/login');

    if (Auth::check())
    {
        if (!Auth::User()->Admin)
            return Redirect::to('/');
    }
    else
        return Redirect::to('/');
});

Этот фильтр не требует изменений в методе входа в систему на моем контроллере, который по-прежнему использует Redirect::intended('/').
Ключевым моментом в этом является НЕ перенаправление для пользователей с правами администратора, просто позволяющее код «проваливается» на исходную страницу, перенаправляются только пользователи без прав администратора.
Я также все еще использую стандартный фильтр «auth» для страниц, требующих аутентификации без прав администратора.

Мои маршруты используют либо:

'before' => 'auth'
'before' => 'admin'

Если я удалю первую строку моего фильтра администратора (которую я скопировал из стандартного фильтра авторизации), я мог бы получить тот же эффект, используя оба фильтра вместе, например так:

'before' => 'auth|admin'
person SteB    schedule 09.02.2014

Если вы хотите перенаправить пользователя к другому, если он является администратором, вы можете выполнить проверку в том же методе контроллера.

if (Auth::attempt($data)
{
    if (Auth::user()->isAdmin())
        // admin
    else
        // not admin
}
else
    // login failed

В этом случае isAdmin() — это метод в User Eloquent, который проверяет, является ли пользователь администратором.

Если вы хотите выполнить эту проверку на других страницах, вы можете создать фильтр, который проверяет, является ли пользователь администратором, например:

Route::filter('admin', function(){

    if ( ! Auth::user()->isAdmin())
    {
        return Redirect::to('/')
         ->withError('No Admin, sorry.');
    }

});
person diegofelix    schedule 06.02.2014
comment
Я хочу направлять только в том случае, если пользователь является администратором и осуществляется доступ к определенным маршрутам (например, /admin). Могу ли я настроить послефильтр для дополнительной проверки и повторного перенаправления? - person SteB; 08.02.2014