|
killich ↓
|
 |
|
20 Август, 2008, 02:39:45
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
К обсуждению:
В качестве основы основы сайта использую следующие модули:
Регистрация.
Авторизация.
Правовой контроль.
Регистрация - процесс довольно простой:
1. логин, пароль, мыло, контрольные цифры
2. данные сохраняются в таблице предрегистрации
3. формируется ключ активации - отсылается пользователю
4. пользователь активирует ключ со своего мыла - данные из предрегистрации переносятся в список пользователей
Авторизация
1. Пользователь указывает логин, пароль
2. проверка
3. В случае успеха в БД в таблицу доступа заносится [рандомный 20 значный ключ + id пользователя + время актуальности ключа]
4. ключ устанавливается в куки клиента (+ время актуальности)
5. при загрузке следующей страницы проверяется соответствия ключа из Кук и БД - если совпадение, то пользователь авторизирован
6. Если ключи совпадают (т.е. пользователь авторизирован), то ключ тут же обновляется и в БД и в Куках. Так время актуальности одного ключа уменьшается. Пользователю достаточно зайти на др. страницу сайта, что бы краденый из кук ключ стал недействительным. При этом сам пользователь не должен вновь вводит данные о регистрации
7. при выходе с сайта ключ удаляется и в куках и в БД
Правовой контроль.
У меня устроено следующим образом.
Существует глобально видимая функция USER() которая возвращает массив данных:
0. id пользователя
1. Логин
2. email.
3. веремя актуальности ключа пользователя.
4. Дескриптор правового набора (например слово - 'Гость' или 'Пользователь')
5. Ассоциативный массив доступа к контроллерам->действиям
например
$guest_sanctions= array(
'basic'=>array (
'enter'=>true
),
'flash'=>array (
'flash'=>true
),
'auth'=>array (
'login'=>true,
'unlogin'=>true
),
'registration'=>array (
'reg_form'=>true,
'user_registration'=>true,
'project_connect'=>true
),
'password'=>array (
'forgotten'=>true,
'password_get'=>true
),
'activation'=>array (
'user_activation'=>true
),
'news'=>array (
'news'=>true,
'reading'=>true
)
);
Функцию можно вызвать из любого места и по ее данным принимать решения о доступе пользователя к данному действию Контроллера или о необходимости отрисовки в Виде какой нибудь ссылки:
например:
Отрисовать кнопку входа в кабинет если у пользователя есть соответствующее разрешение
<?php
// Кнопка -Кабинет-
if(isset($sanctions['cabinet']['enter']) && $sanctions['cabinet']['enter']== true){
?>
<div class= "green_button">
<?php echo to_action ('cabinet', 'enter', 'Кабинет')._BR_; ?>
</div>
<?php
}
?>
Собсно, жду мнений и предложений.
Спасибо.
|
|
|
|
« Последнее редактирование: 20 Август, 2008, 02:48:19 от killich »
|
Записан
|
|
|
|
|
vasa_c ↓
|
 |
|
20 Август, 2008, 02:49:46 , спустя 10 минут 1 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: в ухо Карма: 81
Сообщений: 2458 Сила слова: 3.3
|
Что подразумевается под "модулями"?
Возможно наличие модуля "регистрация" без модуля "авторизация"?
|
|
|
|
|
Записан
|
|
|
|
|
md5 ↓
|
 |
|
20 Август, 2008, 02:51:47 , спустя 2 минуты 1 секунду
|
НЕ ХУЕТА!
ХУЕТА!
|
выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо Карма: не нужна
Сообщений: 10493 Сила слова: 1.19
|
у меня модуль авторизация включает в себя и регистрацию и восстановление пароля и собственно авторизацию
|
|
|
|
|
Записан
|
8: Undefined variable: str Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php Строка: 18 adw0rd: мудень блять, я уже фиксить стал эту фигню :) md5: вуахахахаха
|
|
|
|
killich ↓
|
 |
|
20 Август, 2008, 02:53:39 , спустя 1 минуту 52 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
да вобщем то разные файлы-контроллеры со своими функциями. в принципе [если извратиться] то можно позволить регистрироваться, но закрыть доступ ко входу в систему удалив контроллер или закрыв к нему доступ. это принципиально?
Собсно - 3 разных по назначению набору функций использующих одни и теже таб. в БД. Это все что их связывает.
|
|
|
|
|
Записан
|
|
|
|
|
killich ↓
|
 |
|
20 Август, 2008, 02:54:19 , спустя 40 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
восстановление пароля - у меня отдельный контроллер. его может и не быть
|
|
|
|
|
Записан
|
|
|
|
|
sap ↓
|
 |
|
20 Август, 2008, 03:18:51 , спустя 24 минуты 32 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Жмурики Карма: 40
Сообщений: 2697 Сила слова: 1.48
|
у меня модуль авторизация включает в себя и регистрацию и восстановление пароля и собственно авторизацию
Тоже. Не вижу смысла разделять.
|
|
|
|
|
Записан
|
|
|
|
|
CTAPbIu_MABP ↓
|
 |
|
20 Август, 2008, 03:20:09 , спустя 1 минуту 18 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
мавр
Группа: в ухо Карма: не нужна
Сообщений: 5187 Сила слова: 1.81
|
md5 правду говорит
так как эти три страницы в любом случаи доступны без регистрации
Существует глобально видимая функция USER()
я думал ты с объектами работать будешь...
которая возвращает массив данных
ты не описал как будет генерироваться массив
для меня это очень интересная часть
echo to_action ('cabinet', 'enter', 'Кабинет')._BR_;
а что это за конструкция?
типа функция вернет объект со свойством _BR_ которое ты печатаешь? типа прикольный вывод обрыва строки?
|
|
|
|
|
Записан
|
java.lang.OutOfMemoryError
|
|
|
|
adw0rd ↓
|
 |
|
20 Август, 2008, 04:14:20 , спустя 54 минуты 11 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
эдво
Группа: в ухо Карма: не нужна
Сообщений: 17610 Сила слова: 1.67
|
типа прикольный вывод обрыва строки? xD
|
|
|
|
|
Записан
|
|
|
|
|
killich ↓
|
 |
|
20 Август, 2008, 04:31:47 , спустя 17 минут 27 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
to_action('cabinet','enter', 'Кабинет')._BR_;
если че, то это html хэлпер.
результирующая строка:
<a href="./index.php?ctrl=cabinet&action=enter">Кабинет</a>
или Вы мне руками предлагаете писать часто встречающиеся html элементы?
_BR_ - это константа - в зависимости от варианта дизайна может быть <br>, <br /> или даже \n
ты не описал как будет генерироваться массив
легко:
// Получить полную информацию о пользователе для данного ключа доступа
function USER (){
// Если функция уже была вызвана, то данные храним в это массиве
// (массив очищается после прохождения index.php)
// Иначе далее формируется этот массив
if(isset($_SESSION['user'])) return $_SESSION['user'];
// Получить ключ доступа
$access_key= get_access_key ();
// Если ключа нет, то вернем учетную запись ГОСТЯ
if(is_null($access_key)){
// ----------------------------------------------
// Информация о пользователе Гость (GUEST data)
// ----------------------------------------------
$user= array(
'id'=>NULL,
'ttl'=>NULL,
'login'=>GUEST_LOGIN,
'email'=>NULL,
'status'=>GUEST_STATUS,
'sanctions'=>GUEST_SANCTIONS
);
$_SESSION['user']= $user;
return $_SESSION['user'];
}//--------------------------------------------------
// При каждой новой загрузке страницы сайта ключ доступа меняется
// так если он будет украден и будет известен PHPSSID, то скорее всего
// к таму времени когда хакер сможет использовать связку PHPSSID и access_key
// access_key будет уже не актуален => доступа нет!
$access_key= update_access_key ($access_key);
// Найти id пользователя для данного ключа доступа
$user_id= user_id_by_access_key ($access_key);
// Базовая информация о данном пользователе с таким id и таким access_key
// Т.к пользователь с таким id уже мог выполнить вход с другого компьютера и уже имеет access_key
// А связка (user_id, access_key) гарантирует, что мы не ошибемся при выборке данных о пользователе
$user_info= user_info_for ($user_id, $access_key);
if(is_null($user_info)){
$user_info['login']= GUEST_LOGIN;
$user_info['ttl']= NULL;
$user_info['email']= NULL;
}
$login= $user_info['login'];
$ttl= $user_info['ttl'];
$email= $user_info['email'];
$status= user_status_for ($user_id);
$sanctions= user_sanctions_for ($user_id);
$user= array(
'id'=> $user_id,
'ttl'=> $ttl,
'login'=> $login,
'email'=> $email,
'status'=> $status,
'sanctions'=> $sanctions
);
$_SESSION['user']= $user;
return $_SESSION['user'];
}
где например:
/* Получить ключ доступа от клиента, если такой существует и не просрочен */
function get_access_key (){
// Получить ключ из Куков
$access_key= NULL;
if(isset($_COOKIE['access_key']))
$access_key= $_COOKIE['access_key'];
else return NULL;
$access_info= access_info_by ($access_key);
if(is_null($access_info)) return NULL;
if( isset($access_info['ttl']) &&
$access_info['ttl'] >= time()
) return $access_key;
else{
// Удалить из Куков и БД если время просрочено
setcookie("access_key", '', time()-42000);
delete_access_key_from_bd ($access_key);
return NULL;
}
}
|
|
|
|
|
Записан
|
|
|
|
|
killich ↓
|
 |
|
20 Август, 2008, 04:38:17 , спустя 6 минут 30 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
md5 правду говорит
так как эти три страницы в любом случаи доступны без регистрации
мне удобней по разным файлам. более ответить нечего. не думаю что это принципиально.
|
|
|
|
|
Записан
|
|
|
|
|
CTAPbIu_MABP ↓
|
 |
|
20 Август, 2008, 04:39:31 , спустя 1 минуту 14 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
мавр
Группа: в ухо Карма: не нужна
Сообщений: 5187 Сила слова: 1.81
|
я думал она вернет список доступных пользователю экшенов $guest_sanctions
расскажи как получаеться этот массив
|
|
|
|
|
Записан
|
java.lang.OutOfMemoryError
|
|
|
|
killich ↓
|
 |
|
20 Август, 2008, 04:42:23 , спустя 2 минуты 52 секунды
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
Ну вот еще что есть в листинге выше
// По id пользователя найти Логин, Email, оставшееся время доступа
function user_info_for ($user_id= NULL, $access_key= NULL){
/*
Из трех таблиц __Users, __Emails, __Access_key найдем
1) Логин пользователя по данному id
2) Email по данному id пользователя
3) TTL (время жизни учетки для данного id и access_key)
*/
$quary= "
SELECT
".__Users. ".Login as login,
".__Emails. ".Email as email,
".__Access_key. ".TTL as ttl
FROM ".__Users. ", ".__Access_key. ", ".__Emails. "
WHERE
".__Users. ".Id= '$user_id' AND
".__Access_key. ".User_Id= '$user_id' AND
".__Access_key. ".Rnd_Key= '$access_key' AND
".__Emails. ".Id= ".__Users. ".Email
";
$res= db_query ($quary);
$res= res2array ($res);
if(isset($res[0])) return $res[0];
return NULL;
}
|
|
|
|
|
Записан
|
|
|
|
|
md5 ↓
|
 |
|
20 Август, 2008, 04:47:09 , спустя 4 минуты 46 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
выезд, апартаменты, массаж, стриптиз, подружки, дорого
Группа: в ухо Карма: не нужна
Сообщений: 10493 Сила слова: 1.19
|
мне непонятно, почему мыла в отдельной таблице?
|
|
|
|
|
Записан
|
8: Undefined variable: str Файл: /home/pyha/pyha.ru/forum/bbcode/Xbb/Tags/Man.php Строка: 18 adw0rd: мудень блять, я уже фиксить стал эту фигню :) md5: вуахахахаха
|
|
|
|
killich ↓
|
 |
|
20 Август, 2008, 04:48:34 , спустя 1 минуту 25 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
Группа: Адекваты Карма: 20
Сообщений: 275 Сила слова: 7.27
|
function user_sanctions_for ($user_id= 0){
if($user_id <= 0) return GUEST_SANCTIONS;
// Если установлены общие права
$sanctions= common_sanctions_for ($user_id);
if(isset($sanctions['set'])) return $sanctions['set'];
// Иначе вернем права 'Гостя'
return GUEST_SANCTIONS;
}
// Правовой набор для данного пользователя,
// вернет id набора, описание набора (Статус), Хеш-строку прав
// Иначе NULL
function common_sanctions_for ($user_id= 0){
if($user_id <= 0) return NULL;
$quary= "
SELECT
".__Sanctions. ".Id as id,
".__Sanctions. ".Description as status,
".__Sanctions. ".Set as 'set'
FROM ".__Sanctions. " , ".__User_Sanctions. "
WHERE ".__Sanctions. ".Id= ".__User_Sanctions. ".Sanctions_Set_Id AND
".__User_Sanctions. ".User_Id = '$user_id'
";
$res= db_query ($quary);
$res= res2array ($res);
if(isset($res[0])) return $res[0];
return NULL;
}
где права в БД хранятся в serialize виде:
a:9:{s:5:"basic";a:1:{s:5:"enter";b:1;}s:5:"flash";a:1:{s:5:"flash";b:1;}s:4:"auth";a:2:{s:5:"login";b:1;s:7:"unlogin";b:1;}s:12:"registration";a:4:{s:8:"reg_form";b:1;s:17:"user_registration";b:1;s:15:"project_connect";b:1;s:11:"school_site";b:1;}s:8:"password";a:2:{s:9:"forgotten";b:1;s:12:"password_get";b:1;}s:10:"activation";a:1:{s:15:"user_activation";b:1;}s:4:"news";a:2:{s:4:"news";b:1;s:7:"reading";b:1;}s:7:"cabinet";a:1:{s:5:"enter";b:1;}s:12:"publications";a:8:{s:5:"enter";b:1;s:15:"new_publication";b:1;s:20:"save_new_publication";b:1;s:15:"my_publications";b:1;s:16:"publication_edit";b:1;s:18:"update_publication";b:1;s:10:"attach_doc";b:1;s:10:"attach_img";b:1;}}
|
|
|
|
|
Записан
|
|
|
|
|
CTAPbIu_MABP ↓
|
 |
|
20 Август, 2008, 04:48:44 , спустя 10 секунд
|
НЕ ХУЕТА!
ХУЕТА!
|
мавр
Группа: в ухо Карма: не нужна
Сообщений: 5187 Сила слова: 1.81
|
еще раз повторяю ворпрос
как ты получаешь вот этот массив экшенов и разрешений
$guest_sanctions= array(
'basic'=>array(
'enter'=>true
),
'flash'=>array(
'flash'=>true
),
'auth'=>array(
'login'=>true,
'unlogin'=>true
),
'registration'=>array(
'reg_form'=>true,
'user_registration'=>true,
'project_connect'=>true
),
'password'=>array(
'forgotten'=>true,
'password_get'=>true
),
'activation'=>array(
'user_activation'=>true
),
'news'=>array(
'news'=>true,
'reading'=>true
)
);
|
|
|
|
|
Записан
|
java.lang.OutOfMemoryError
|
|
|
|