Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 18.06.2013 12:08:53

Да, с точки зрения хеша md5(date(’W’)), ок.

Но про рандомную строку вовсе не понял: какой вид должна в итоге иметь кука? айди_админа~рандомная_строка?
У нас цель чтобы кука стала не действительна через какое то время после того как её украли. Хранится она в шифрованном виде.
Какую мне рандомную строку добавлять чтобы понять что через какой-то срок она не действительна? В случае с неделями я сравниваю номер недели.
Да, при генерации куки с md5(microtime()) (рандомная строка) при входе каждый раз разная кука, ну и что, если я её скопирую себе то она будет действительна, и я залогинюсь от админа

#2 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 17.06.2013 12:44:28

А, ну первый абзац я понял, да. Просто laravel 4 хранит куки не в виде «хеш~значение», я привел выше пример. Поэтому делаю вывод что куки хранятся в шифрованном а не хешированном виде (http://laravel.com/docs/security#encryption случаем не так?).

В моем случае получается я храню значение айдишника админа в виде: admin_id~date(’W’). Это значение лежит в зашифрованном виде (в любом случае его в фаербаге не видно никак, только рандомный набор символов). После этого, когда я получаю куку я разбиваю по тильде и смотрю день недели. Если он не равен текущем то куа не действительна?

Вот так?

PHP
        // Супер админ может залогинется от другого юзера
    
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);

#3 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 14.06.2013 15:35:19

Если хеширование, то как мы можем получить в принципе значение кук, хеш на то и хеш что мы можем только сверить значение (юзер ввел пароль, мы его захешировали и сравнили хеш. а в куках мы напрямую получаем значение Cookie::get)

Вообще опять не понятно. Почему это должно помочь. Вот например, у юзера в куках лежит какая-то цифра, типа количество раз сколько он зашел на сайт. Я эту куку ворую, и у меня на сайте отображается та же инфа. Потом юзер (у кого я своровал) заходит еще раз, и цифра увеличивается. Но почему у меня должно пропасть значение которогое я своровал?

Я попробовал открыть 2 браузера, залогинется от имени юзера на одном, потом копирнул куки на другой. Вижу два одинаковых экрана. Потом на первом браузере разлогиневаюсь, прибавляю к куки рандом Cookie::make(’sudoer’, $id.’123123213’), залогиневаюсь обратно. Вижу тот же экран. И жму на обоих экранах «Вернутся к администратору» (по этой ссылке я просто вывожу значение айдишника админа). На одном я вижу айдишник админа, на другом айдишник админа + рандом. И там и там кука работает, просто лежит в ней разное

#4 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 13.06.2013 15:47:00

А в laravel 4 я как вижу и так значения не хранятся в открытом виде:
sudoer = eyJpdiI6IjJsXC80aDQ5d3V4NE9aSlBmRDFxTjhySHJzUDQ5dzlsY0xJaGV4aDdoUDBRPSIsInZhbHVlIjoiXC9hVW5ybFRibUJUaHpHTXBuV0pKR1kzVDU2TW8zNmZKWEEwYkd3YURaaVU9IiwibWFjIjoiNjBlNTQ5MjdmOGZmNTFlM2M5NzRjN2I5Mjc4YWI5ZWJiZWFmYWJiY2U2NDE1NzkxODFjZGRjMjg0OTcwMGQ0MyJ9

Но если её в таком виде украсть то у юзера появится кнопочка «Зайти обратно к админу».

Я не очень понял насчет добавления даты. Т.е. например я сейчас кладу PHPCookie::make('sudoer'Auth::user()->id) типа айдишник админа. Ты предлагаешь класть что то вроде

PHP
Cookie::make('sudoer', array('created_at' => time(), 'expires_at' => time() + 60*60*24*7'admin_id' => $id);

И дальше когда достаешь куку проверять не сдохла ли она по времени и если да то регенерировать? Или как?)

Еще вопрос по терминологии — когда мы говорим о хешировании куки, подразумевается шифрование, т.е. там не md5 какой-нибудь, иначе мы бы не смогли достать данные из кук — верно? Используется именно шифрование по app.key

#5 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 13.06.2013 12:57:10

Как то так тогда что ли:

PHP
// Главная. Проверяем залогинен ли юзер
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, айпи и т.п. внутри содержимого и тогда даже если её украсть нельзя будет её использовать ? (Ну, понятно что можно все подделать, но при этом айпи например нам неизвестен еже)

#6 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 11.06.2013 17:46:01

У меня есть admin, есть client. У них разные админки. У каждого свой логин и пароль. Клиентов много, админ один.
If ($role =='admin') { грузим админку админа; }
if ($role == 'client') { грузим админку клиента; }

Но админ должен иметь возможность увидеть админку глазами клиента

#7 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 11.06.2013 16:47:33

Потом звонит юзер и говорит "у меня что-то в админке цифры не те, можете посмотреть?", а я ему: "не, не могу, дайте пароль" smile

#8 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 11.06.2013 14:20:51

"чтобы админ при выходе снова стал собой" - да, вот так

#9 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 11.06.2013 14:19:04

Админ зашел на сайт, авторизовался (либо с галочкой "запомнить меня" либо без неё, как решит). Ему вывелся список пользователей и рядом с каждым юзером иконка "войти от юзера". После того как он кликнул, он залогинелся от имени этого юзера и видит его админку + кнопку "вернуться назад от админа" по нажатию на которую он становится админом.

logged_from_admin чтобы отобразить кнопку. Ну можно без неё, просто проверять есть ли admin_id. Только меня смущает класть это в куки.

#10 Re: Laravel 4 » [L4] Вход от имени другого пользователя » 11.06.2013 13:33:02

А что туда записать, типа logged_from_admin = true, admin_id = ... ?
И сделать кнопку если есть такая кука, по кнопке переходим на ф-ию где проверка опять же наличия куки, и если она есть - релогин из под admin_id?
Просто не хорошо же хранить такие данные в куках?

Да, laravel 4

#11 Laravel 4 » [L4] Вход от имени другого пользователя » 11.06.2013 12:39:06

Etern1ty
Ответов: 24

Всем привет!

Такой вопрос назрел - делаю систему авторизации. У меня есть несколько ролей, среди них админ. Мне нужно чтобы я от админа мог зайти под любым другим пользователем и выйти соотвественно. Если бы я использовал обычные сессии, то задача решается установкой id залогиненного юзера, и id админа (чтобы вернуться обратно). Но я пытаюсь использовать те средства что предоставляет laravel, и не очень понимаю как грамотно все сделать.

Во-первых у меня щас стоит время жизни сессии 0, т.е. по закрытию браузера сессия обнуляется.
Во-вторых у меня есть галка типа "Запомнить меня", $remember = true то бишь.

Одновременно писать
Auth::logout();
Auth::login(User::find($id));
нельзя, ругается с ошибкой.

Без logout-а вроде сработало, но если я проставлю Session::put('logged_from_admin', true) то после закрытия браузера я уже потеряю эту переменную. Можно убрать нулевое время, но тогда смысл в галке "Запомнить меня"

И я не очень понял разницу между login и loginUsingId (разве что один принимает модель, другой айдишник). С помощью второй ф-ии залогиниться не получилось вообще

Подвал раздела