Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Immortal 18.06.2003 10:47
Для тех, кто не хочет стандартную авторизацию в admin-section сайта:# Класс для управления авторизацией пользователей # Copyright (c) 2003 Immortal @CLASS session ################################# ## конструктор класса @load[] $sessions[^table::sql{ SELECT a_sessions.login, a_sessions.session_id, a_users.user_group, a_users.f_name, a_users.s_name, a_users.l_name, a_users.email, a_users.user_status FROM a_sessions, a_users WHERE a_sessions.login = a_users.login } ] $hash_of_sessions[^sessions.hash[session_id]] ################################# ## Создание сессии @logon[data][user_from_db;crypted;r1;r0] $user_from_db[^table::sql{ SELECT login, passwd, user_status FROM a_users WHERE login = '$data.login' } ] # пробуем криптовать пароль, полученный от юзера ^try{ $crypted[^math:crypt[$data.passwd;$user_from_db.passwd]] # если без ^try, можно получить ошибку "salt must start with '$apr1$'" # в случае, если таблица $user_from_db пуста и $user_from_db.passwd # естейственно не start with '$apr1$' :) }{ $exception.handled(1) } # проверяем наличие юзера с таким логином/паролем ^if(def $user_from_db.login && $user_from_db.passwd eq $crypted){ # если такой юзер есть, проверяем его статус (активен/заморожен ^if($user_from_db.user_status eq 'active'){ # если юзер активен, генерим случайный ключ $now[^date::now[]] $r1[^math:crypt[${now.year}${now.month}${now.day}${now.hour}${now.minute}${now.second}^math:random(1000000);^$apr1^$]] $r0[^r1.mid(7)] # очищаем старые записи таблицы сессий ^void:sql{DELETE FROM a_sessions WHERE TO_DAYS(NOW()) - 1 >= TO_DAYS(last_access)} # пишем в базу сгенереный выше ключ ^void:sql{ INSERT INTO a_sessions SET login = '$user_from_db.login', session_id = '$r0', last_access = ^mysql:now[] } # и в cookie пишем то же $cookie:session_id[ $.value[$r0] $.expires[session] ] # рефрэшим страницу $response:refresh[ $.value[0] $.url[/] ] }{ # если юзер заморожен, выдаем соотв. страницу $response:body[^skiner[user_frozen]] } }{ # если нет такого юзера, выдаем соотв. страницу $response:body[^skiner[invalid_user]] } ################################# ## Страница авторизации @logon_screen[][data] ^if(def $form:login && def $form:passwd){ $data[^hash::create[]] $data.login[$form:login] $data.passwd[$form:passwd] # запускаем метод создания сессии ^logon[$data] }{ # показываем эту страницу авторизации $response:body[^skiner[logon]] } ################################# ## Прекращение сессии @logoff[] # сразу конкретно удаляем данные текущей сессии ^void:sql{DELETE FROM a_sessions WHERE session_id = '^get[session_id]'} # затираем cookie $cookie:session_id[] # отправляем на страницу авторизации $response:location[/] $response:refresh[ $.value[0] $.url[/] ] ################################# ## Получение данных о сессии # с любой страницы системы можно получить инфу о вошедшем юзере # например вызов ^session:get[фамилия] возвращает фамилию данного юзера @get[field][field] ^switch[$field]{ ^case[user]{$hash_of_sessions.[$cookie:session_id].login} ^case[user_group]{$hash_of_sessions.[$cookie:session_id].user_group} ^case[session_id]{$hash_of_sessions.[$cookie:session_id].session_id} ^case[имя]{$hash_of_sessions.[$cookie:session_id].f_name} ^case[отчество]{$hash_of_sessions.[$cookie:session_id].s_name} ^case[фамилия]{$hash_of_sessions.[$cookie:session_id].l_name} ^case[email]{$hash_of_sessions.[$cookie:session_id].email} ^case[DEFAULT]{Параметр '$field' не существует} }