Главная > Flex > Модуль авторизации для Flex-приложений (part 1)

Модуль авторизации для Flex-приложений (part 1)

Приведу один из своих опытов, а именно: “Модуль авторизации для Flex-приложений”

Идея сводится к одному – необходимо авторизовать пользователя в приложении и выдать ему какие-то права доступа.

База данных для пользователей – MySQL.
Данные передаются в формате XML через PHP.

На стороне Flex за передачу и прослушку отвечает HTTPService.

Оговорюсь сразу, данный пример НЕ ИСПОЛЬЗУЕТ сессии. Хотя как будет время, я постараюсь его доработать для этого.

Итак. Создаем базу данных MySQL:


CREATE DATABASE  `common` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

CREATE TABLE `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '' COMMENT 'логин',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT 'пароль',
`firstname` varchar(50) DEFAULT NULL COMMENT 'Имя',
`lastname` varchar(50) DEFAULT NULL COMMENT 'Фамилия',
`email` varchar(50) DEFAULT NULL COMMENT 'электронная почта',
`department` varchar(10) DEFAULT NULL COMMENT 'отдел',
`appointment` varchar(100) DEFAULT NULL COMMENT 'должность',
`permission` varchar(10) NOT NULL DEFAULT '' COMMENT 'разрешения',
PRIMARY KEY (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

Движок InnoDB так как возможно подключение других таблиц (например таблица разрешений по различным проектам).

Данные я забивал через phpmyadmin, у меня их было немного. А так, можно конечно сделать отдельную админку…
Пароли хэшируются алгоритмом sha1. Для генерации хэша паролей пользователей на локальном серваке сделал страничку со следующим файлом pass-gen.php
Затем результат присылали мне.
код pass-gen.php :

<?php
if(!$_POST)
 {
?>
 <form method="post">
 <input type="text" name="pass">
 <input type="submit">
 </form>
<?php
 }
else
 {
 $data=$_POST['pass'];
 print sha1($data);
 }
?>

За соединение с базой отвечает файл: login.php
в качестве имени сервера используется “localhost”, пользователь “db_user”, пароль “db_pass”, которые вы замените на свои.

<?php
/***********************************************************************
*  - используется mySQLi
*  - XML формируется при помощи DOM
************************************************************************/

// описываем параметры соединения
define( "DATABASE_SERVER", "localhost" );
define( "DATABASE_USERNAME", "db_user" );
define( "DATABASE_PASSWORD", "db_pass" );
define( "DATABASE_NAME", "common" );
$table = "users";

//содаем объект содержащий соединение с базой данных
$conn = @new mysqli(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME);

// проверка ошибок соединения
if (mysqli_connect_errno() !==0 )
{
 // если ошибка при коннекте с базой данных
 $error_num = mysqli_connect_errno();
 $error_message = mysqli_connect_error();

 // передаем данные об ошибке в функцию
 sendErrorData($error_num, $error_message);

}
 else
{
 // если нет ошибки при коннекте с базой данных

 // устанавливаем кодировку соединения
 //$conn->query("SET CHARACTER SET 'utf8'");
 $conn->query("SET NAMES 'utf8'");

 // Данные из Flex передаются в переменную POST
 $username = mysqli_real_escape_string($conn, $_POST["username"]);

 //для проверки скрипта, пока не готов Flex-модуль можно использовать предварительно забитый в базу testuser
 //$username = mysqli_real_escape_string($conn, "testuser");

 // шифруем входящий пароль
 // sha1 - 40 знаков, md5 - 32 знака
 $password = sha1($_POST["password"]);

 //для проверки скрипта, пока не готов Flex-модуль можно использовать предварительно забитый в базу пароль для testuser - "testpass"
 //$password = sha1("testpass");

 // запрос в базу данных
 $query_str = "SELECT * FROM $table WHERE username = '$username' AND password = '$password'";
 $resultData = @$conn->query($query_str);

 // проверям на ошибки после запроса
 if ($resultData === FALSE)
 {
 $error_num = $conn->errno;
 $error_message = $conn->error;
 // передаем данные об ошибке в функцию
 sendErrorData($error_num, $error_message);
 // закрываем соединение
 $conn->close();
 }
 else
 // формирование ответа
 {

 $result_row = $resultData->fetch_object();
 // проверка есть ли такой пользователь
 if(!$result_row)
 {
 // нет записи
 sendLoginError();

 }else{
 // добавим авторизациооные данные
 sendLoginData($result_row);
 }
 // закрываем соединение
 $conn->close();
 }

}
// Функция возвращает данные об ошибках при соединении с базой данных или при выполнении запроса.
function sendErrorData($myerr_num, $myerr_desc) {

 $dom = new DOMdocument('1.0', 'utf-8');    # Создание XML DOM Document
 $dom->formatOutput = true;                # Форматируем вывод
 $rows = $dom->appendChild($dom->createElement('data'));    # Создадим root XML element
 $rows->appendChild($row = $dom->createElement('error', 'yes'));    # Создадим первый элемент - error
 $rows->appendChild($row = $dom->createElement('error_num', $myerr_num));    # Создадим второй элемент - номер ошибки
 $rows->appendChild($row = $dom->createElement('error_desc', $myerr_desc));    # Создадим третий элемент - описание ошибки

 // выводим ответ
 print $dom->saveXML();
}

// Функция возвращает данные  - авторизация не прошла.
function sendLoginError() {

 $dom = new DOMdocument('1.0', 'utf-8');    # Создание XML DOM Document
 $dom->formatOutput = true;                # Форматируем вывод
 $rows = $dom->appendChild($dom->createElement('data'));    # Создадим root XML element
 $rows->appendChild($row = $dom->createElement('error', 'no'));    # Создадим первый элемент - error
 $rows->appendChild($row = $dom->createElement('loginsuccess', 'no'));    # Создадим второй элемент - прошла ли авторизация

 // выводим ответ
 print $dom->saveXML();
}

// Функция возвращает данные  - авторизация прошла успешно + все данные пользователя.
function sendLoginData($my_result) {

 $dom = new DOMdocument('1.0', 'utf-8');    # Создание XML DOM Document
 $dom->formatOutput = true;                # Форматируем вывод
 $rows = $dom->appendChild($dom->createElement('data'));    # Создадим root XML element
 $rows->appendChild($row = $dom->createElement('error', 'no'));    # Создадим первый элемент - error
 $rows->appendChild($row = $dom->createElement('loginsuccess', 'yes'));    # Создадим второй элемент - прошла ли авторизация
 // добавление данных
 $rows->appendChild($row = $dom->createElement('Ufirstname', $my_result->firstname));     # Создадим элемент - FirstName
 $rows->appendChild($row = $dom->createElement('Ulastname', $my_result->lastname));         # Создадим элемент - LastName
 $rows->appendChild($row = $dom->createElement('Uemail', $my_result->email));             # Создадим элемент - Email
 $rows->appendChild($row = $dom->createElement('Udepartment', $my_result->department));    # Создадим элемент - Department
 $rows->appendChild($row = $dom->createElement('Uappointment', $my_result->appointment));# Создадим элемент - Appointment
 $rows->appendChild($row = $dom->createElement('Upermission', $my_result->permission));    # Создадим элемент - Permission

 // выводим ответ
 print $dom->saveXML();
}

?>

В итоге мы получим 4 вида XML данных.
1. Ошибка соединения с базой данных

<?xml version="1.0" encoding="utf-8"?>
<data>
  <error>yes</error>
  <error_num>1045</error_num>
  <error_desc>Access denied for user 'testuser'@'localhost' (using password: YES)</error_desc>
</data>

2. Ошибка в коде запроса

<?xml version="1.0" encoding="utf-8"?>
<data>
  <error>yes</error>
  <error_num>1064</error_num>
  <error_desc>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEL#ECT * FROM users WHERE username = 'testuser' AND password = 'c06aa3f4a6aa99f' at line 1</error_desc>
</data>

3. Авторизация не прошла

<?xml version="1.0" encoding="utf-8"?>
<data>
  <error>no</error>
  <loginsuccess>no</loginsuccess>
</data>

4. Авторизация прошла успешно

<?xml version="1.0" encoding="utf-8"?>
<data>
  <error>no</error>
  <loginsuccess>yes</loginsuccess>
  <Ufirstname>Василий</Ufirstname>
  <Ulastname>Пупкин</Ulastname>
  <Uemail>mail@microsoft.com</Uemail>
  <Udepartment>FIN</Udepartment>
  <Uappointment>финансовый директор</Uappointment>
  <Upermission>RO</Upermission>
</data>

На днях опубликую вторую часть, где приведу код анализа этих данных, со стороны Flex.

P.S. Сильно камнями не кидайте, так как это мой первый опыт использования mySQLi и DOM

Categories: Flex Tags: , , , ,
  1. Drosha
    5 Январь 2010 в 16:49 | #1

    спасибо за статью, то что надо для начинающего :)

Я не робот.