parser

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

 

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

Простой класс авторизации

foof 13.05.2009 22:01

Всем здравствуйте!
Я написал простой класс авторизации для своего сайта. Хочу попросить форумчан посмотреть код и прокомментировать недочеты и ошибки. Буду очень благодарен!
@CLASS
auth

#Методы:
#@status[] - Елемент на всех страницах сайта, который выводит либо информацию о пользователе, либо форму логина
#@login[] - Авторизация пользователя на сайте
#@logout[] - выход из системы
#@loginForm[msg] - Выводит форму для логина, где $msg - сообщение об ошибке
#@registration[] - Регистрация новых пользователей
#@activation[] - Активация аккаунта
#@regform[msg] - Выводит форму регистрации, где $msg - сообщение об ошибке
#@isEmail[email] - проверяет e-mail на корректность
#@sendEmail[login;hash] посылает письмо после регистрации с активационным ключом, где $login - имя пользователя, а $hash - активационный код
#@userId[] - Идентификация пользователя по кукам

#Елемент на всех страницах сайта, который выводит либо информацию о пользователе, либо форму логина
@status[]
^if(^userId[] != 0){
	^try{
		^MAIN:esconnect{$user[^table::sql{SELECT `id`,`login` FROM `user` WHERE `session` = '$cookie:session'}]}
		<a href=/profile.html?id=$user.id>$user.login</a> <a id="logout" href="/logout.html">Выход</a>
	}{
		$exception.handled(1)
		^loginForm[]
	}
}{
	^loginForm[]
}

#Авторизация пользователя на сайте
@login[]
^if(def $form:login && def $form:password){
	^try{
		$login[$form:login]
		$login[^login.trim[]]
		$password[$form:password]
		$password[^password.trim[]]
		^MAIN:esconnect{$user[^table::sql{SELECT `id`,`login`, `password`, `status` FROM `user` WHERE `login` = '$login'}]}
		^if(^math:crypt[$password;$user.password] eq $user.password){
			^if($user.status == 1){
				$str[^math:uuid[]]
				$hash[^math:sha1[$str]]
				$now[^date::now[]]
				^MAIN:esconnect{^void:sql{UPDATE `user` SET `session` = '$hash',  `lastlogin` = '^now.sql-string[]' WHERE `id` = '$user.id'}}
				$cookie:session[
					$.value[$hash] 
					$.expires(30)
				]
				$response:location[/$form:uri]
			}{
				^loginForm[Ваш аккуант не активирован]
			}
		}{
			^loginForm[Вы ввели неверный логин или пароль]
		}
	}{
		$exception.handled(1)
		^loginForm[Вы ввели неверный логин или пароль]
	}
}{
	^if(^userId[] == 0){
		^loginForm[]
	}{
		Вы уже авторизированны!
	}
}

#выход из системы
@logout[]
^try{
	^MAIN:esconnect{^void:sql{UPDATE `user` SET `session` = '' WHERE `session` = '$cookie:session'}}
	$msg[Вы успешно вышли из системы!]
	^loginForm[$msg]
}{
	$exception.handled(1)
	$msg[Вы успешно вышли из системы! Но возникла проблема с БД!]
	^loginForm[$msg]
}
$cookie:session[]

#Выводит форму для логина
#msg - сообщение об ошибке
@loginForm[msg]
^if(!def $msg){$msg[<a href="/registration.html">Регистрация</a>]}
<form id="loginform" action="/login.html" method="post">
	Логин: <input type="text" name="login" /><br>
	Пароль: <input type="password" name="password" /><br>
	<input type="hidden" name="uri" value="$request:uri">
	<input type="submit" name="go" value="Войти" />
</form>
<span id="msg">$msg</span>

#Регистрация новых пользователей
@registration[]
^if($form:go eq "Зарегистрироваться"){
	^if(def $form:login && def $form:password && def $form:password2 && def $form:email){
		^try{
			^MAIN:esconnect{$user(^string:sql{SELECT COUNT(`id`) FROM `user` WHERE `login` = '$form:login'})}
			^if($user == 0){
				^if($form:password eq $form:password2){
					^if(^isEmail[$form:email]){
						^MAIN:esconnect{$email(^string:sql{SELECT COUNT(`id`) FROM `user` WHERE `email` = '$form:email'})}
						^if($email == 0){
							$login[$form:login]
							$password[$form:password]
							$password[^password.trim[]]
							$password[^math:crypt[$password;^$apr1^$]]
							$email[$form:email]
							$now[^date::now[]]
							$str[^math:uuid[]]
							$hash[^math:sha1[$str]]
							^MAIN:esconnect{^void:sql{INSERT INTO `user` (`login`, `password`, `email`, `session`, `regdate`) VALUES ('^login.trim[]', '$password', '^email.trim[]', '$hash', '^now.sql-string[]')}}
							$login[^login.trim[]]
							^sendEmail[$login;$hash]
							Поздравляем! Вы успешно зарегистрировались!
						}{
							^regform[Пользователь с таким e-mail уже существует]
						}
					}{
						^regform[E-mail введён некорректно]
					}
				}{
					^regform[Пароли не совпадают]
				}
			}{
				^regform[Пользователь с таким именем уже существует]
			}
		}{
			$exception.handled(1)
			^regform[Ошибка]
		}
	}{
		^regform[Заполните все поля формы]
	}
}{
	^regform[]
}

#Активация аккаунта
@activation[]
^if(def $form:code){
	^try{
		^MAIN:esconnect{^void:sql{UPDATE `user` SET `session` = '',  `status` = '1' WHERE `session` = '$form:code'}}
		Поздравляем! Ваш аккаунт успешно активирован!
	}{
			$exception.handled(1)
			Произошла ошибка
	}
}{
	Нужен код активации!
}

#Выводит форму регистрации
#msg - сообщение об ошибке
@regform[msg]
<span id="msg">$msg</span>
<form id="regform" method="post">
	Логин: <input type="text" name="login" /> <br />
	Пароль: <input type="password" name="password" /> <br />
	Подтвердите пароль: <input type="password" name="password2" /> <br />
	E-mail: <input type="text" name="email" /> <br />
	<input type="submit" name="go" value="Зарегистрироваться" />
</form>

#проверяет e-mail на корректность
@isEmail[email]
$result(
^email.match[^^(?:[-a-z\d\+\*\/\?!{}`~_%&'=^^^$#]+(?:\.[-a-z\d\+\*\/\?!{}`~_%&'=^^^$#]+)*)@(?:[-a-z\d_]+\.){1,60}[a-z]{2,6}^$][i]
)

#посылает письмо после регистрации с активационным ключом
#login - имя пользователя
#hash - активационный код
@sendEmail[login;hash]
^try{
	^MAIN:esconnect{$email[^string:sql{SELECT `email` FROM `user` WHERE `login` = '$login'}]}
	^mail:send[
		$.from[info@site.ru]
		$.to[$email]
		$.subject[Регистрация на сайте site.ru]
		$.text[
			Здравствуйте, ${login}!
			Спасибо за регистрацию на сайте site.ru
			http://site.ru/activation.html?code=$hash
		]
	]
}{
	$exception.handled(1)
	^regform[Ошибка при отправке письма]
}

#Идентификация пользователя по кукам
#Результат: либо id пользователя, либо 0, если гость
@userId[]
^try{
	^MAIN:esconnect{$id(^string:sql{SELECT COUNT(`id`) FROM `user` WHERE `session` = '$cookie:session'})}
	^if($id == 1){
		^MAIN:esconnect{$id(^string:sql{SELECT `id` FROM `user` WHERE `session` = '$cookie:session'})}
		$result($id)
	}{
		$result(0)
	}
}{
	$exception.handled(1)
	$result(0)
}