Модуль авторизации для 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
спасибо за статью, то что надо для начинающего