Воскресенье, 22 Декабря 2024, 18:59

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[ TigaEngine Lesson #1 ] Модуль Авторизации и Регистрации
WoogyДата: Пятница, 01 Февраля 2013, 06:02 | Сообщение # 1
был не раз
Сейчас нет на сайте
И так всем привет! Как и было обещенно, для ядра TigaEngine будет выпущен ряд уроков по созданию браузерной игры (экономической стратегии)
Первое что вам надо понять , я показываю пример создания браузерной игры (а не учу вас основам программирования), далее необходимо запастись временем
,терпением и безмерным количеством кофе smile

В качестве основы будет использоваться TigaEngine (написанный на PHP и имеющий свою архитектуру), в качестве Суб БД будет использоваться MYSQL -
но как же PDO ? - как я уже говорил я не учу вас основам программирования , mysql - это просто (но если есть знания используйте PDO).
Дабы придать игре динамичность - используем JQuery(я также не буду вас обучасть элементарным вещам JQ,JS)

Начнем с модуля авторизации и разделения контента для гостей и игроков :)
Шаг 1 (описание и создание баз)
Не мало важно правельно создать базу данных , сейчас мы создадим 3 базы , не будем танцивать с бубном ...




Шаг 2 ( кодинг )

Далее зайдем в engine/classes/Session.php
Найдем private $time; после добавим
Код

var $logged_in = false;
var $referrer, $url;
public $userinfo = array();
        


Найдемsession_start(); после добавим
Код

            $this->logged_in = $this->checkLogin();

            if (isset($_SESSION['url'])) {
                $this->referrer = $_SESSION['url'];
            } else {
                $this->referrer = "/";
            }
            $this->url = $_SESSION['url'] = $_SERVER['PHP_SELF'];

            $this->SurfControl();

Найдем // Ещё функции класса , после добавим
Код

private function checkLogin() {
            global $db;
            if (isset($_SESSION['USER']['ID']) && isset($_SESSION['USER']['SID'])) {
                if (!$db->checkActiveSession($_SESSION['USER']['ID'], $_SESSION['USER']['SID'])) {
                    $this->Logout();
                    return false;
                } else {
                    $db->addActiveUser($_SESSION['USER']['ID'], $this->time);
                    $db->updateUserField($_SESSION['USER']['ID'], "timestamp", $this->time, 0);
                    return true;
                }
            } else {
                return false;
            }
        }

        public function login($uid) {
            global $db, $generator;
            $this->logged_in = true;

            $_SESSION['USER']['SID'] = $generator->generateRandID();
            $_SESSION['USER']['ID'] = $uid;

            $db->addActiveUser($_SESSION['USER']['ID'], $this->time);
        }

        public function Logout() {
            global $db;
            $this->logged_in = false;
            $db->updateUserField($_SESSION['username'], "sessid", "", 0);
            if (ini_get("session.use_cookies")) {
                $params = session_get_cookie_params();
                setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
            }
            session_destroy();
            session_start();
        }

        private function SurfControl() {

            $pagearray_guest = array("def", "register", "login"); // Разрешенные модули для гостя (не авторизованного пользователя)
            $pagearray_user = array("def", "game", "user", "settings"); // Модули для зарегистрированного пользователя

            $app = empty($_GET['app']) ? 'def' : $_GET['app'];
            $app = rtrim($app, '/');
            $app = explode('/', $app);

            preg_match("/([a-zA-Z]*)([0-9]*)/", $app[0], $url_step);

            if (!$this->logged_in) {
                if (!in_array($app[0], $pagearray_guest)) {
                    header("Location: " . DOMAIN . "");
                }
            } else {
                    
                    if (!in_array($app[0], $pagearray_user)) {
                        header("Location: " . DOMAIN . "");
                    }
                    
            }
        }

Теперь переходим в engine/classes/DB_Mysql.php
Находим // Дополнительные функции класса , после добавляем
Код

     function checkactiveSession($id, $sessid) {
            $user = $this->getUserArray($id, 1);
            $sessidarray = explode("+", $_SESSION['USER']['SID']);
            if (in_array($sessid, $sessidarray)) {
                return true;
            } else {
                return false;
            }
        }

        function getUserArray($ref, $mode) {
            if (!$mode) {
                $q = "SELECT * FROM ".TIGA_BD_PREF."users where login = '$ref'";
            } else {
                $q = "SELECT * FROM ".TIGA_BD_PREF."users where id = $ref";
            }
            $result = mysql_query($q, $this->connection);
            return mysql_fetch_array($result);
        }

        function updateUserField($ref, $field, $value, $mode) {
            if (!$mode) {
                $q = "UPDATE ".TIGA_BD_PREF."users set $field = '$value' where login = '$ref'";
            } elseif ($mode == 1) {
                $q = "UPDATE ".TIGA_BD_PREF."users set $field = '$value' where id = '$ref'";
            } elseif ($mode == 2) {
                $q = "UPDATE ".TIGA_BD_PREF."users set $field = $field + '$value' where id = '$ref'";
            }
            return mysql_query($q, $this->connection);
        }

        function addActiveUser($id, $time) {
            $uip = $_SERVER['REMOTE_ADDR'];
            $q = "INSERT into ".TIGA_BD_PREF."active values ('$id',$time,'$uip')";
            if (mysql_query($q, $this->connection)) {
                return true;
            } else {
                return false;
            }
        }
            
        function UpdateOnline($mode, $name = "") {
            global $session;
            if ($mode == "login") {
                $q = "INSERT IGNORE INTO ".TIGA_BD_PREF."online (name, time) VALUES ('$name', " . time() . ")";
                return mysql_query($q, $this->connection);
            } else {
                $q = "DELETE FROM ".TIGA_BD_PREF."online WHERE name ='" . $session->username . "'";
                return mysql_query($q, $this->connection);
            }
        }

Сообственно с самым сложным закончили smile приступаем к самому модулю
Заходим в engine/mods/ и создаем файл login.php и всатвляем код
Код

<?php

/*
      +--------------------------------------------------------------------------
      |  TigaEngine
      |  ========================================
      |  By Tiga Team
      |
      |  ========================================
      |  login.php - модуль авторизации
     */

if (!defined('TIGA_RUN')) {
        die($lang_core['access_deniend']);
}

Далее нам надо проверить передана ли нам форма , после } Добавим код

if($_POST['send_login']){
        // Логика
}else{
        // Шаблон
}


Переходим в theme и создаем шаблон login.tpl авторизации (будет содержаться форма), открываем этот шаблон...
и вставляем в него :
Код

<form method='post'>
        Логин:<BR>
        <input type="text" name="login" value=""><BR>
        Пароль:<BR>
        <input type="password" name="password" value=""><BR>
        <input type="submit" name="send_login" value="Отправить">
</form>

Далее в engine/mods/login.php находим // Шаблон, после вставляем
Код

$content = $tpl->parse('login.tpl');

Переходим к написанию логики
в engine/mods/login.php находим // Логика, после вставляем
Код

$password = strip_tags(addslashes($_POST['password']));
$login = strip_tags(addslashes($_POST['login']));

if (!$email && !$password) {
     $_SESSION['ERROR']['1'] = 'Поле логина и пароля являются обязательными для заполнения.';
}

$q1 = "SELECT * FROM ".TIGA_BD_PREF."users WHERE login='" . $login . "' AND password='" . md5($password) . "'";
$array1 = $database->query_return($q1);

if (count($array1) == 0) {
     $_SESSION['ERROR']['2'] = 'Ошибка логин/пароля.';
}

if ($_SESSION['ERROR']) {
     echo '<h2>Ошибка Авторизации</h2>';
     if ($_SESSION['ERROR']['1']) {
      echo '<p>' . $_SESSION['ERROR']['1'] . '</p>';
     }else{
      echo '<p>' . $_SESSION['ERROR']['2'] . '</p>';
     }
     session_destroy();
}else{
     foreach ($array1 as $row) {
      $u_id = $row['id'];
     }
         
     echo '<h2>Успешная Авторизация</h2>';
     echo '<a href='.DOMAIN.'>На главную</a>';
     $session->login($u_id);
         
}

Теперь когда у нас есть авторизация , нам нужна регистрация smile
Модуль регистрации очень прост! Начнем
Заходим в engine/mods/ и создаем файл register.php и всатвляем код
Код

<?php

/*
      +--------------------------------------------------------------------------
      |  TigaEngine
      |  ========================================
      |  By Tiga Team
      |
      |  ========================================
      |  register.php - модуль регистрации
     */

if (!defined('TIGA_RUN')) {
        die($lang_core['access_deniend']);
}

Далее нам надо проверить передана ли нам форма , после } Добавим код
Код

if($_POST['send_register']){
        // Логика
}else{
        // Шаблон
}

Переходим в theme и создаем шаблон register.tpl авторизации (будет содержаться форма), открываем этот шаблон...
и вставляем в него :
Код

<form method='post'>
        Логин:<BR>
        <input type="text" name="login" value=""><BR>
     Email:<BR>
        <input type="text" name="email" value=""><BR>
        Пароль:<BR>
        <input type="password" name="password" value=""><BR>
        <input type="submit" name="send_register" value="Отправить">
</form>


Далее в engine/mods/register.php находим // Шаблон, после вставляем
Код

$content = $tpl->parse('register.tpl');

Переходим к написанию логики
Находим в engine/mods/registerphp находим// Логика, после вставляем    
Код

$password = strip_tags(addslashes($_POST['password']));
$login = strip_tags(addslashes($_POST['login']));
$email = strip_tags(addslashes($_POST['email']));

if (!$email && !$password && !$email) {
     $_SESSION['ERROR']['2'] = 'Все поля обязательны для заполнения.';
}

if (!eregi("^([a-z0-9]+)([._-]([a-z0-9]+))*[@]([a-z0-9]+)([._-]([a-z0-9]+))*[.]([a-z0-9]){2}([a-z0-9])?$", $email)) {
     $_SESSION['ERROR']['3'] = 'Неверный формат EMAILa.';
}

if (strlen($password) < 6 || strlen($password) > 12) {
     $_SESSION['ERROR']['4'] = 'Пароль должен состоять от 6 до 12 символов.';
}

$q1 = "SELECT * FROM ".TIGA_BD_PREF."users WHERE email='" . $email . "' AND login='".$login."'";
$array1 = $database->query_return($q1);

if (count($array1) != 0) {
     $_SESSION['ERROR']['1'] = 'Ошибка, логин или email уже используется';
}

if ($_SESSION['ERROR']) {
     if ($_SESSION['ERROR']['2']) {
      echo '<p>' . $_SESSION['ERROR']['2'] . '</p>';
     }else{
      if($_SESSION['ERROR']['1']){
       echo '<p>' . $_SESSION['ERROR']['1'] . '</p>';
      }else{
       echo '<p>' . $_SESSION['ERROR']['3'] . '</p>';
       echo '<p>' . $_SESSION['ERROR']['4'] . '</p>';
      }
     }
}else{
     $password = md5($_POST['password']);
        $q2 = "INSERT INTO users (login , email, password) values ('" . $login . "','" . $email . "','" . $password . "')";
        $res = $database->query($q2) or die(mysql_error());
     echo 'Регистрация завершина! <a href="'.DOMAIN.'">на главную :)</a>';
     // Тут продолжим регистрацию в след уроках  
}


Собственно если будут вопросы , спрашиваем smile


Сообщение отредактировал Woogy - Пятница, 01 Февраля 2013, 07:00
IIyxMASTERДата: Пятница, 01 Февраля 2013, 07:45 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Это урок по созданию своего движка или всетки по использованию готового?
Не слишком ли дохрена кода приходится писать разработчику?
Движок должен брать на себя все рутинные операции. Из приведенных выше простыней не понятно, чем разработка на вашем детище отличается от написания странички с нуля.
в идеале код вашего пользователя должен выглядеть так:
Код
Регистрация:
Движок.хочуЗарегитцо(логин,пароль,мыло)

Аутентификация:
Движок.ПроверьПароль(логин,пароль)

Добавлено (01.02.2013, 07:45)
---------------------------------------------
вопрос всего один.
Чем вот те вот простыни сверху отличаются от разработки с нуля?

TiendilДата: Пятница, 01 Февраля 2013, 11:26 | Сообщение # 3
участник
Сейчас нет на сайте
Без обид, но до гордого статуса «урока» этот текст не дотягивает.
Урок — это не последовательность фраз "вставим код" — это объяснение того, что, почему и как мы делаем, здесь же никакого объяснения нет в принципе.

Хранить пароль пропущенный через md5 без солений — это всё равно, что хранить его в открытом виде — уже давно существуют необходимые базы для восстановления данных по md5.
Логика обработки пароля вообще странная — зачем чистить его от тегов, у человека что, не может быть пароля "<javascript></javascript>"? Более того, зачем его чистить, эскейпить и только потом проверять его длину - она же будет отличаться от того, что ввёл пользователь. Ну а после всех чисток и проверок в базу заносится "сырой пароль" - т.е. не то, что проверяли.

И ещё вопрос по миру php: там до сих пор не пользуются фреймворками, или это особенность данного проекта?


Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

Текущий проект: the-tale.org - indie mmozpg
WoogyДата: Пятница, 01 Февраля 2013, 13:07 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата (Tiendil)
Без обид, но до гордого статуса «урока» этот текст не дотягивает.
Урок — это не последовательность фраз "вставим код" — это объяснение того, что, почему и как мы делаем, здесь же никакого объяснения нет в принципе.

Хранить пароль пропущенный через md5 без солений — это всё равно, что хранить его в открытом виде — уже давно существуют необходимые базы для восстановления данных по md5.
Логика обработки пароля вообще странная — зачем чистить его от тегов, у человека что, не может быть пароля "<javascript></javascript>"? Более того, зачем его чистить, эскейпить и только потом проверять его длину - она же будет отличаться от того, что ввёл пользователь. Ну а после всех чисток и проверок в базу заносится "сырой пароль" - т.е. не то, что проверяли.

И ещё вопрос по миру php: там до сих пор не пользуются фреймворками, или это особенность данного проекта?


Не понятно как вы читали статью , я ясно дал понять что это не объяснение элементарных вещей (если вам не понятно что я вставляю, думаю лучше вообще забыть о php)

Пароль я закинул в md5 чисто ради примера (соль зацепить не проблема).

не понял по поводу мира PHP - перефразируйте предложение чтоб его кто то понимал , кроме вас.
jekiДата: Пятница, 01 Февраля 2013, 15:33 | Сообщение # 5
участник
Сейчас нет на сайте
Что так все любят ООП? dry
Или я один идиот его не знаю......


Поставьте + плизми



Сообщение отредактировал jeki - Пятница, 01 Февраля 2013, 15:33
likerДата: Пятница, 01 Февраля 2013, 15:49 | Сообщение # 6
почетный гость
Сейчас нет на сайте
все любят ооп lol

Сообщение отредактировал liker - Пятница, 01 Февраля 2013, 15:49
DreamOffДата: Пятница, 01 Февраля 2013, 17:55 | Сообщение # 7
был не раз
Сейчас нет на сайте
Все любят ООП ))) ООП делает работу проще )
jekiДата: Пятница, 01 Февраля 2013, 20:39 | Сообщение # 8
участник
Сейчас нет на сайте
DreamOff, liker, это я в курсе.

Поставьте + плизми

TiendilДата: Пятница, 01 Февраля 2013, 21:05 | Сообщение # 9
участник
Сейчас нет на сайте
Цитата (Woogy)
Не понятно как вы читали статью , я ясно дал понять что это не объяснение элементарных вещей (если вам не понятно что я вставляю, думаю лучше вообще забыть о php)

Да всё понятно что там вставлено, не ясно зачем. Если декларируется что не объясняются элементарные вещи, так зачем приводить код, в котором только они и делаются.

Ещё раз повторю, задача любого нормального урока не только показать "как", но и объяснить "для чего" и "почему именно так ". Если этот урок показывает как сделать простую регистрацию, то почему не объясняет почему её нужно делать именно так, а не иначе? Где объяснение того для чего md5 сумма берётся и эскейпится парамтры? Если же эти знания считаются элементарными, то чему неэлементарному учит этот урок?

Цитата (Woogy)
Пароль я закинул в md5 чисто ради примера (соль зацепить не проблема).

А Люди, которые будут по вашим урокам учиться программы делать, должны догадаться, что это чисто ради примера, а не для реальной системы?

Цитата (Woogy)
не понял по поводу мира PHP - перефразируйте предложение чтоб его кто то понимал , кроме вас.

Существуют ли на php фреймворки ориентированные на web-разработку (аналоги Django и Rails, например) и если существуют, почему всё делается на сыром php - такой подход буквально обещает тысячи багов и море лишнего кода.


Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

Текущий проект: the-tale.org - indie mmozpg
HerrPotapovДата: Суббота, 09 Февраля 2013, 18:55 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
Tiendil, автор объясняет в своей теме, что фреймворки тянут за собой кучу ненужного барахла, а его фреймворк - самый фреймворковый фреймворк.
Ах да, а еще он очень быстрый - страничку за 28 мс генерирует.


Discord: alpotapov#1741

Интервью с разработчиком WarCastle - Читаем и вникаем!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг