Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Да, с точки зрения хеша md5(date(’W’)), ок.
Но про рандомную строку вовсе не понял: какой вид должна в итоге иметь кука? айди_админа~рандомная_строка?
У нас цель чтобы кука стала не действительна через какое то время после того как её украли. Хранится она в шифрованном виде.
Какую мне рандомную строку добавлять чтобы понять что через какой-то срок она не действительна? В случае с неделями я сравниваю номер недели.
Да, при генерации куки с md5(microtime()) (рандомная строка) при входе каждый раз разная кука, ну и что, если я её скопирую себе то она будет действительна, и я залогинюсь от админа
А, ну первый абзац я понял, да. Просто laravel 4 хранит куки не в виде «хеш~значение», я привел выше пример. Поэтому делаю вывод что куки хранятся в шифрованном а не хешированном виде (http://laravel.com/docs/security#encryption случаем не так?).
В моем случае получается я храню значение айдишника админа в виде: admin_id~date(’W’). Это значение лежит в зашифрованном виде (в любом случае его в фаербаге не видно никак, только рандомный набор символов). После этого, когда я получаю куку я разбиваю по тильде и смотрю день недели. Если он не равен текущем то куа не действительна?
// Супер админ может залогинется от другого юзера
Route::group(array('before' => 'superAdminJSON'), function() {
Route::get('loginAsUser/{id}', function($id) {
$sudoer = Cookie::make('sudoer', Auth::user()->id.'~'.date('W')); // Кука с днем недели
Auth::login(User::find($id));
return Redirect::back()->withCookie($sudoer);
});
});
// .... Генерация вьюшки для обычного клиента
if (!Cookie::has('sudoer')) { // Если куки нет то нет
$sudoer = false;
} else {
$cookie = explode('~', Cookie::get('sudoer')); // Если кука есть то разбиваем по тильде
$sudoer = $cookie[1] === date('W') ? true : false; // Если неделя сегодняшняя то тру, иначе фолс
}
return View::make('client')->with('sudoer', $sudoer)
->with('email', $user->email);
Если хеширование, то как мы можем получить в принципе значение кук, хеш на то и хеш что мы можем только сверить значение (юзер ввел пароль, мы его захешировали и сравнили хеш. а в куках мы напрямую получаем значение Cookie::get)
Вообще опять не понятно. Почему это должно помочь. Вот например, у юзера в куках лежит какая-то цифра, типа количество раз сколько он зашел на сайт. Я эту куку ворую, и у меня на сайте отображается та же инфа. Потом юзер (у кого я своровал) заходит еще раз, и цифра увеличивается. Но почему у меня должно пропасть значение которогое я своровал?
Я попробовал открыть 2 браузера, залогинется от имени юзера на одном, потом копирнул куки на другой. Вижу два одинаковых экрана. Потом на первом браузере разлогиневаюсь, прибавляю к куки рандом Cookie::make(’sudoer’, $id.’123123213’), залогиневаюсь обратно. Вижу тот же экран. И жму на обоих экранах «Вернутся к администратору» (по этой ссылке я просто вывожу значение айдишника админа). На одном я вижу айдишник админа, на другом айдишник админа + рандом. И там и там кука работает, просто лежит в ней разное
А в laravel 4 я как вижу и так значения не хранятся в открытом виде:
sudoer = eyJpdiI6IjJsXC80aDQ5d3V4NE9aSlBmRDFxTjhySHJzUDQ5dzlsY0xJaGV4aDdoUDBRPSIsInZhbHVlIjoiXC9hVW5ybFRibUJUaHpHTXBuV0pKR1kzVDU2TW8zNmZKWEEwYkd3YURaaVU9IiwibWFjIjoiNjBlNTQ5MjdmOGZmNTFlM2M5NzRjN2I5Mjc4YWI5ZWJiZWFmYWJiY2U2NDE1NzkxODFjZGRjMjg0OTcwMGQ0MyJ9
Но если её в таком виде украсть то у юзера появится кнопочка «Зайти обратно к админу».
Я не очень понял насчет добавления даты. Т.е. например я сейчас кладу PHPCookie::make('sudoer', Auth::user()->id)
типа айдишник админа. Ты предлагаешь класть что то вроде
Cookie::make('sudoer', array('created_at' => time(), 'expires_at' => time() + 60*60*24*7, 'admin_id' => $id);
И дальше когда достаешь куку проверять не сдохла ли она по времени и если да то регенерировать? Или как?)
Еще вопрос по терминологии — когда мы говорим о хешировании куки, подразумевается шифрование, т.е. там не md5 какой-нибудь, иначе мы бы не смогли достать данные из кук — верно? Используется именно шифрование по app.key
// Главная. Проверяем залогинен ли юзер
Route::get('/', function() {
if (Auth::check())
$user = Auth::user();
// Если админ
if (Company::isSuperAdmin($user->company_id)) {
// Достать юзеров которые не админы
$users = User::join('settings', 'settings.value', '!=', 'users.company_id')
->where('settings.name', '=', 'admin_id')
->get();
return View::make('admin')->with('users', $users);
} else {
// Если не админ то передаем куку sudoer. Если она есть, выводим ссылку "Вернутся к админу"
return View::make('client')->with('sudoer', Cookie::get('sudoer'))
->with('email', $user->email);
}
} else {
return View::make('login');
}
});
Route::get('logout', function() {
Auth::logout();
// Если есть кука то удалить её (-1 время жизни)
if (Cookie::get('sudoer')) {
$sudoer = Cookie::make('sudoer', false, -1);
return Redirect::to('/')->withCookie($sudoer);
} else {
return Redirect::to('/');
}
});
// Логинемся от админа под другим юзером
Route::get('loginAsUser/{id}', array('before' => 'superAdminJSON', function($id) {
$sudoer = Cookie::make('sudoer', Auth::user()->id); // Кука с айди админа
Auth::login(User::find($id));
return Redirect::back()->withCookie($sudoer);
}));
// Возвращаемся в админку из под админа
Route::get('returnToAdmin', function() {
if (Cookie::get('sudoer')) {
Auth::login(User::find(Cookie::get('sudoer')));
return Redirect::back()->withCookie(Cookie::make('sudoer', false, -1)); // Удаляем куку
}
});
Я правильно понимаю что главное в куках это то что юзер не может ничего поменять, но если их типа украдут с компа то их можно будет использовать? Я попробовал в двух браузерах вручную скопировать содержимое кук и все сработало, но можно же приписывать user agent, айпи и т.п. внутри содержимого и тогда даже если её украсть нельзя будет её использовать ? (Ну, понятно что можно все подделать, но при этом айпи например нам неизвестен еже)
У меня есть admin, есть client. У них разные админки. У каждого свой логин и пароль. Клиентов много, админ один.
If ($role =='admin') { грузим админку админа; }
if ($role == 'client') { грузим админку клиента; }
Но админ должен иметь возможность увидеть админку глазами клиента
Потом звонит юзер и говорит "у меня что-то в админке цифры не те, можете посмотреть?", а я ему: "не, не могу, дайте пароль"
"чтобы админ при выходе снова стал собой" - да, вот так
Админ зашел на сайт, авторизовался (либо с галочкой "запомнить меня" либо без неё, как решит). Ему вывелся список пользователей и рядом с каждым юзером иконка "войти от юзера". После того как он кликнул, он залогинелся от имени этого юзера и видит его админку + кнопку "вернуться назад от админа" по нажатию на которую он становится админом.
logged_from_admin чтобы отобразить кнопку. Ну можно без неё, просто проверять есть ли admin_id. Только меня смущает класть это в куки.
А что туда записать, типа logged_from_admin = true, admin_id = ... ?
И сделать кнопку если есть такая кука, по кнопке переходим на ф-ию где проверка опять же наличия куки, и если она есть - релогин из под admin_id?
Просто не хорошо же хранить такие данные в куках?
Да, laravel 4
Всем привет!
Такой вопрос назрел - делаю систему авторизации. У меня есть несколько ролей, среди них админ. Мне нужно чтобы я от админа мог зайти под любым другим пользователем и выйти соотвественно. Если бы я использовал обычные сессии, то задача решается установкой id залогиненного юзера, и id админа (чтобы вернуться обратно). Но я пытаюсь использовать те средства что предоставляет laravel, и не очень понимаю как грамотно все сделать.
Во-первых у меня щас стоит время жизни сессии 0, т.е. по закрытию браузера сессия обнуляется.
Во-вторых у меня есть галка типа "Запомнить меня", $remember = true то бишь.
Одновременно писать
Auth::logout();
Auth::login(User::find($id));
нельзя, ругается с ошибкой.
Без logout-а вроде сработало, но если я проставлю Session::put('logged_from_admin', true) то после закрытия браузера я уже потеряю эту переменную. Можно убрать нулевое время, но тогда смысл в галке "Запомнить меня"
И я не очень понял разницу между login и loginUsingId (разве что один принимает модель, другой айдишник). С помощью второй ф-ии залогиниться не получилось вообще
Страницы 1