Таким образом, кажется, вопрос был немного запутан в отношении аутентификации и пароля. Я уточню это.
В моем приложении любой аутентифицированный пользователь может создать команда и быть его капитан. Но в ходе этого процесса им предлагается определить Команда-пароль которые должны использоваться для РЕДАКТИРОВАНИЯ информации о команде, такой как аватар, электронная почта, участники и т. д.
Поэтому мне нужно сделать вид издания доступным ТОЛЬКО для капитана этой команды, и ЕСЛИ у него есть правильный Команда-пароль. Что я имел в виду под «аутентификацией», так это проверка того, является ли этот пользователь капитаном, и является ли пароль команды паролем команды ($team->password
) в базе данных. Это не имеет ничего общего с аутентифицированными пользователями Sentry. Извини за это.
Следовательно, мне нужно защитить редакцию этой команды от любого другого пользователя, который может попытаться получить к нему доступ. Надеюсь, теперь все ясно.
У меня есть вид, который должен видеть только конкретный пользователь и только если он вводит правильный пароль (как на странице редактирования личной информации или что-то в этом роде). Следовательно, это представление должно быть защищено от злонамеренных атак, даже если его маршрут установлен на GET.
Я попробовал два способа сделать это, но ни один не сработал.
@if
пункт для отображения вида, только если это правильный пользователь. (НЕ РАБОТАЕТ: пароль необходимо отправить через форму. Это не пароль пользователя, поэтому я не могу получить к нему доступ через Auth::User()
или же Sentry::getUser()
внутри вид.)Итак, мой вопрос: есть ли более простой способ сделать это? Каков наиболее используемый или лучший способ сделать это? Это мое первое настоящее приложение, использующее Laravel, поэтому я еще не сталкивался с этими вещами.
Заранее спасибо!
Я помню ваш последний вопрос, но так как вы не дали обновления, я также не смог ничего опубликовать. Тем не менее, вы делаете это сложнее, чем есть.
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.
если пользователь не вошел в систему, то доступ ко всем этим защищенным маршрутам вызовет перенаправление, и пользователь будет перенаправлен в форму входа. После успешного входа он будет перенаправлен на страницу своего профиля. С другой стороны, если вошедший в систему пользователь пытается перейти в форму входа в систему, он будет перенаправлен на страницу профиля, поскольку вошедший в систему пользователь не должен видеть форму входа в систему.
это проще, чем вы думаете.
псевдокод.
Других решений пока нет …