Я добавил стандартный фильтр авторизации к нескольким маршрутам с использованием Route :: Intended ('/') в контроллере (при условии, что вход в систему будет успешным).
filters.php:
Route::filter('auth', function(){ if (Auth::guest()) return Redirect::guest('internal/login'); });
контроллер:
if (Auth::attempt($data, false)) { return Redirect::intended('/'); }
Как мне создать настраиваемый фильтр auth, который проверяет наличие определенного разрешения (isAdmin в этом случае)?
Я сделал фильтр auth.admin таким же, как стандартный фильтр auth, чтобы перенаправить на страницу входа в систему, но мне нужен второй метод входа на моем контроллере или есть способ определить, какой фильтр (если есть) вызвал контроллер метод?
if (Auth::attempt($data, false)) { if (RouteHasAdminFilter()) { if (!Auth::User()->Admin) return Redirect::intended('/'); else return Redirect::to('/'); } else { return Redirect::intended('/'); } }
Спасибо @diegofelix за то, что поставили меня на правильный путь.
Мне удалось написать фильтр, который:
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('/'); });
Этот фильтр не требует изменений в методе Login на моем контроллере, который по-прежнему использует перенаправление :: предназначено ('/').
Ключом к этому является НЕ перенаправление для пользователей Admin, просто позволяя коду «проваливаться» на исходную страницу, перенаправляются только пользователи, не являющиеся администраторами.
Я также по-прежнему использую стандартный фильтр «auth» для страниц, для которых требуется аутентификация, отличная от admin.
Мои маршруты:
'before' => 'auth' 'before' => 'admin'
Если я удалю первую строку моего админ-фильтра (который я скопировал из стандартного фильтра auth), я мог бы получить тот же эффект, используя оба фильтра вместе так:
'before' => 'auth|admin'
Если вы хотите перенаправить пользователя к другому, если он является администратором, вы можете выполнить проверку в том же методе контроллера.
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.'); } });