parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Пример класса cookie-авторизации

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