Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 22 Май, 2012, 06:46:16

Страниц: [1] 2 3 ... 6
Печать
Автор Тема: Основа CMS  (Прочитано 5222 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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. Ассоциативный массив доступа к контроллерам->действиям
например
PHP

    $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

        <?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()
я думал ты с объектами работать будешь...
 
которая возвращает массив данных
ты не описал как будет генерироваться массив
для меня это очень интересная часть
 
PHP
echo to_action('cabinet','enter', 'Кабинет')._BR_;

а что это за конструкция?
типа функция вернет объект со свойством _BR_ которое ты печатаешь? типа прикольный вывод обрыва строки?
Записан

java.lang.OutOfMemoryError
adw0rd    ↓ 
20 Август, 2008, 04:14:20 , спустя 54 минуты 11 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17610
Сила слова: 1.67

типа прикольный вывод обрыва строки?
xD
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
killich    ↓ 
20 Август, 2008, 04:31:47 , спустя 17 минут 27 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 20
Сообщений: 275
Сила слова: 7.27

to_action('cabinet','enter', 'Кабинет')._BR_;

если че, то это html хэлпер.
результирующая строка:
 
<a href="./index.php?ctrl=cabinet&amp;action=enter">Кабинет</a>
 
или Вы мне руками предлагаете писать часто встречающиеся html элементы?
 
_BR_ - это константа - в зависимости от варианта дизайна может быть <br>, <br /> или даже \n
 
ты не описал как будет генерироваться массив

легко:
 
PHP

        // Получить полную информацию о пользователе для данного ключа доступа   
        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'];
        }
 

где например:
 
PHP

    /* Получить ключ доступа от клиента, если такой существует и не просрочен */
    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

Ну вот еще что есть в листинге выше
PHP

        // По 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

PHP

 
        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

еще раз повторяю ворпрос
 
как ты получаешь вот этот массив экшенов и разрешений
 
Text

$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
Страниц: [1] 2 3 ... 6
Печать
 

Перейти в: