Самый эффективный способ защиты вида в Laravel 4.2?

Редактировать:

Таким образом, кажется, вопрос был немного запутан в отношении аутентификации и пароля. Я уточню это.

В моем приложении любой аутентифицированный пользователь может создать команда и быть его капитан. Но в ходе этого процесса им предлагается определить Команда-пароль которые должны использоваться для РЕДАКТИРОВАНИЯ информации о команде, такой как аватар, электронная почта, участники и т. д.

Поэтому мне нужно сделать вид издания доступным ТОЛЬКО для капитана этой команды, и ЕСЛИ у него есть правильный Команда-пароль. Что я имел в виду под «аутентификацией», так это проверка того, является ли этот пользователь капитаном, и является ли пароль команды паролем команды ($team->password) в базе данных. Это не имеет ничего общего с аутентифицированными пользователями Sentry. Извини за это.

Следовательно, мне нужно защитить редакцию этой команды от любого другого пользователя, который может попытаться получить к нему доступ. Надеюсь, теперь все ясно.

Главный вопрос:

У меня есть вид, который должен видеть только конкретный пользователь и только если он вводит правильный пароль (как на странице редактирования личной информации или что-то в этом роде). Следовательно, это представление должно быть защищено от злонамеренных атак, даже если его маршрут установлен на GET.

Я попробовал два способа сделать это, но ни один не сработал.

  1. Установите маршрут GET, который показывает страницу аутентификации. Установите POST-маршрут с тем же URL-адресом, который отображает представление после аутентификации пользователя. (НЕ РАБОТАЕТ: не мог понять, как перенаправить пользователей на POST-маршрут снова, чтобы им не приходилось выполнять аутентификацию каждый раз, когда они меняют информацию о фрагменте.)
  2. Аутентификация пользователя через представление. То есть используя @if пункт для отображения вида, только если это правильный пользователь. (НЕ РАБОТАЕТ: пароль необходимо отправить через форму. Это не пароль пользователя, поэтому я не могу получить к нему доступ через Auth::User() или же Sentry::getUser() внутри вид.)

Итак, мой вопрос: есть ли более простой способ сделать это? Каков наиболее используемый или лучший способ сделать это? Это мое первое настоящее приложение, использующее Laravel, поэтому я еще не сталкивался с этими вещами.

Заранее спасибо!

0

Решение

Я помню ваш последний вопрос, но так как вы не дали обновления, я также не смог ничего опубликовать. Тем не менее, вы делаете это сложнее, чем есть.

Route.php

Route::get('login', 'LoginController@getLogin');
Route::post('login', 'LoginController@postLogin');
Route::group(['before' => 'authentication'], function(){
Route::get('profile' => 'ProfileController@profile');
//All protected routes here
});

что я сделал здесь, я создаю фильтр authentication который будет работать против всех маршрутов внутри группы.

Теперь давайте определим фильтр.

Route::filter('authentication', function()
{
if ( ! Sentry::check())
{
return Redirect::action('LoginController@getLogin');
}
});

это простой фильтр, который проверяет, вошел ли пользователь в систему или нет. Если пользователь не вошел в систему, он перенаправит пользователя на login маршрут, где будет подана форма.

контроллер:

public function getLogin()
{
if(Sentry::check())
{
return Redirect::action('ProfileController@profile');
}

return View::make('login');
}

public function postLogin()
{
//put the validation rules here and validate. as far as i remember, you know how to do it.

if($validator->passes())
{
try
{
// Login credentials
$credentials = array(
'email'    => 'john.doe@example.com',
'password' => 'password',
);

// Authenticate the user
$user = Sentry::authenticate($credentials, false);
return Redirect::action('ProfileController@profile');
}
catch (Cartalyst\Sentry\Users\LoginRequiredException $e)
{
echo 'Login field is required.';
}
catch (Cartalyst\Sentry\Users\PasswordRequiredException $e)
{
echo 'Password field is required.';
}
catch (Cartalyst\Sentry\Users\WrongPasswordException $e)
{
echo 'Wrong password, try again.';
}
catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
{
echo 'User was not found.';
}
catch (Cartalyst\Sentry\Users\UserNotActivatedException $e)
{
echo 'User is not activated.';
}

// The following is only required if the throttling is enabled
catch (Cartalyst\Sentry\Throttling\UserSuspendedException $e)
{
echo 'User is suspended.';
}
catch (Cartalyst\Sentry\Throttling\UserBannedException $e)
{
echo 'User is banned.';
}}
}

в блоке catch примите необходимые меры. например если вы хотите перенаправить на вход с ошибкой, то добавьте ошибку в пакет сообщений (если вы не знаете, как это сделать, кликните сюда для деталей) и перенаправить на форму входа.

или, если это ajax-данные, вы можете вернуть ошибки как json, а затем проанализировать их на стороне клиента, показывая сообщение об ошибке при сбое ajax.

если пользователь не вошел в систему, то доступ ко всем этим защищенным маршрутам вызовет перенаправление, и пользователь будет перенаправлен в форму входа. После успешного входа он будет перенаправлен на страницу своего профиля. С другой стороны, если вошедший в систему пользователь пытается перейти в форму входа в систему, он будет перенаправлен на страницу профиля, поскольку вошедший в систему пользователь не должен видеть форму входа в систему.

это проще, чем вы думаете.

псевдокод.

  • 1-я проверка, если пользователь вошел в систему. Если нет то перенаправить его на страницу входа.
  • 2-й, если он вошел в систему, когда он идет по URL (страница пароля команды), проверьте, является ли он капитаном (вызов базы данных). если нет, то перенаправить его на другую страницу или показать ему запрещенную страницу 403.
  • 3-й, если он капитан, то покажи ему форму. и установить некоторый сеанс, чтобы при последующих вызовах вы могли проверять авторизацию со ссылкой на этот токен.
  • В-четвертых, если аутентификация правильная, то перенесите его на страницу редактирования. в противном случае перейдите к шагу 3 с сообщением об ошибке, чтобы человек знал об ошибке при вводе пароля.
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector