| Новости | 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' не существует}
}