Показать сообщение отдельно
  #13 (permalink)  
Старый 24.04.2012, 16:02
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Если таблица юзера в БД примерно такая:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(15) NOT NULL AUTO_INCREMENT,

   // логин пользователя
  `username` varchar(255) NOT NULL,
   // пароль пользователя в md5 формате
  `password` varchar(32) NOT NULL,
   // некий md5 хеш для проверки авторизации юзера
  `passkey` varchar(32) NOT NULL,

   // NULL если не заблокирован, иначе время в формате unix timestamp указывающую дату блокировки
  `blocked` int(15) unsigned DEFAULT NULL,

   // NULL если не активирован аккаунт, иначе время в формате unix timestamp указывающую дату активации
  `activated` int(15) unsigned DEFAULT NULL,

  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


То можно сделать примерно такой вариант:
function check_user_auth() {

	if ( isset( $_COOKIE['ruirm'] ) ) {

		$sql_result = mysql_query( "SELECT COUNT(*) FROM `users` ".
				"WHERE md5(CONCAT(`passkey`, md5(`id`), md5(`username`), md5(`password`)))='".
				mysql_real_escape_string( $_COOKIE['ruirm'] )."' ".
				"AND ISNULL(`blocked`) ".
				"AND NOT ISNULL(`activated`);"
		);

		if ( mysql_num_rows( $sql_result ) > 0 ) {

			SetCookie( "ruirm", $_COOKIE['ruirm'], time() + 60*60*24*30*12*5 );

			return true;

		} else {
			SetCookie( "ruirm", '', time() + 60*60*24*30*12*5 );
		}
	}

	return false;
}

if ( check_user_auth() ) {
	echo "Пользователь авторизован!";
} else {
	echo "Пользователь не авторизован!";
}
Но без использования сессий, это критично для БД.

После авторизации в куку значение ruirm генерить так:
SetCookie("ruirm",
	md5( $user['passkey']. // текущее значение passkey из БД
	md5( $user['id'] ). // Id пользователя в БД
	md5( $user['username'] ). // логин пользователя
	md5( $user['password'] ) ), // хешпароль пользователя в БД
	time() + 60*60*24*30*12*5  // сохраним на пять лет :)
);
где переменная $user содержит данные пользователя из БД

Если пользователь сменит пароль, во всех браузерах где он был авторизован слетит авторизация, так же можно добавить у пользователя в аккаунте кнопочку, "Выйти из всех браузеров" после нажатия на которую меняем passkey на какой-нить другой. Генерация этого passkey может быть любая, на ваш вкус. Но менять ее может лишь юзер который жмакнул кнопку "Выйти из всех браузеров". Или сервак может сменить например при блокировании юзера что бы он вылетел со всех браузеров и т.д.

Если юзать сессии, то тогда не нужно будет постоянно обращаться в БД, а лишь один раз в случае если в сессии нет инфы об авторизации юзера.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием