<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Зона 51 &#187; DOM</title>
	<atom:link href="http://www.bushnev.com/blog/tag/dom/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bushnev.com/blog</link>
	<description>мои заметки на тему RIA, Flex и всего остального…</description>
	<lastBuildDate>Sat, 21 Nov 2009 22:47:49 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Модуль авторизации для Flex-приложений (part 1)</title>
		<link>http://www.bushnev.com/blog/2009/11/10/flex-authorization-part-1/</link>
		<comments>http://www.bushnev.com/blog/2009/11/10/flex-authorization-part-1/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 23:03:58 +0000</pubDate>
		<dc:creator>Alexey Bushnev</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[MySQLi]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.bushnev.com/blog/?p=27</guid>
		<description><![CDATA[Приведу один из своих опытов, а именно: &#8220;Модуль авторизации для Flex-приложений&#8221;
Идея  сводится к одному &#8211; необходимо авторизовать пользователя в приложении и выдать ему какие-то права доступа.
База данных для пользователей &#8211; MySQL.
Данные передаются в формате XML через PHP.
На стороне Flex за передачу и прослушку отвечает HTTPService.
Оговорюсь сразу, данный  пример НЕ ИСПОЛЬЗУЕТ сессии. Хотя как [...]]]></description>
			<content:encoded><![CDATA[<p>Приведу один из своих опытов, а именно: &#8220;Модуль авторизации для Flex-приложений&#8221;</p>
<p>Идея  сводится к одному &#8211; необходимо авторизовать пользователя в приложении и выдать ему какие-то права доступа.</p>
<p>База данных для пользователей &#8211; MySQL.<br />
Данные передаются в формате XML через PHP.</p>
<p>На стороне Flex за передачу и прослушку отвечает HTTPService.</p>
<p>Оговорюсь сразу, данный  пример НЕ ИСПОЛЬЗУЕТ сессии. Хотя как будет время, я постараюсь его доработать для этого.<br />
<span id="more-27"></span><br />
Итак. Создаем базу данных MySQL:</p>
<pre class="brush: sql;">

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;
</pre>
<p>Движок InnoDB так как возможно подключение других таблиц (например таблица разрешений по различным проектам).</p>
<p>Данные я забивал через phpmyadmin, у меня их было немного. А так, можно конечно сделать отдельную админку&#8230;<br />
Пароли хэшируются алгоритмом sha1. Для генерации хэша паролей пользователей на локальном серваке сделал страничку со следующим файлом pass-gen.php<br />
Затем результат присылали мне.<br />
код pass-gen.php :</p>
<pre class="brush: php;">
&lt;?php
if(!$_POST)
 {
?&gt;
 &lt;form method=&quot;post&quot;&gt;
 &lt;input type=&quot;text&quot; name=&quot;pass&quot;&gt;
 &lt;input type=&quot;submit&quot;&gt;
 &lt;/form&gt;
&lt;?php
 }
else
 {
 $data=$_POST['pass'];
 print sha1($data);
 }
?&gt;
</pre>
<p>За соединение с базой отвечает файл: login.php<br />
в качестве имени сервера используется &#8220;localhost&#8221;, пользователь &#8220;db_user&#8221;, пароль &#8220;db_pass&#8221;, которые вы замените на свои.</p>
<pre class="brush: php;">
&lt;?php
/***********************************************************************
*  - используется mySQLi
*  - XML формируется при помощи DOM
************************************************************************/

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

//содаем объект содержащий соединение с базой данных
$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-&gt;query(&quot;SET CHARACTER SET 'utf8'&quot;);
 $conn-&gt;query(&quot;SET NAMES 'utf8'&quot;);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

?&gt;
</pre>
<p><strong>В итоге мы получим 4 вида XML данных.</strong><br />
<strong>1.</strong> Ошибка соединения с базой данных</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;data&gt;
  &lt;error&gt;yes&lt;/error&gt;
  &lt;error_num&gt;1045&lt;/error_num&gt;
  &lt;error_desc&gt;Access denied for user 'testuser'@'localhost' (using password: YES)&lt;/error_desc&gt;
&lt;/data&gt;
</pre>
<p><strong>2.</strong> Ошибка в коде запроса</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;data&gt;
  &lt;error&gt;yes&lt;/error&gt;
  &lt;error_num&gt;1064&lt;/error_num&gt;
  &lt;error_desc&gt;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&lt;/error_desc&gt;
&lt;/data&gt;
</pre>
<p><strong>3.</strong> Авторизация не прошла</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;data&gt;
  &lt;error&gt;no&lt;/error&gt;
  &lt;loginsuccess&gt;no&lt;/loginsuccess&gt;
&lt;/data&gt;
</pre>
<p><strong>4.</strong> Авторизация прошла успешно</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;data&gt;
  &lt;error&gt;no&lt;/error&gt;
  &lt;loginsuccess&gt;yes&lt;/loginsuccess&gt;
  &lt;Ufirstname&gt;Василий&lt;/Ufirstname&gt;
  &lt;Ulastname&gt;Пупкин&lt;/Ulastname&gt;
  &lt;Uemail&gt;mail@microsoft.com&lt;/Uemail&gt;
  &lt;Udepartment&gt;FIN&lt;/Udepartment&gt;
  &lt;Uappointment&gt;финансовый директор&lt;/Uappointment&gt;
  &lt;Upermission&gt;RO&lt;/Upermission&gt;
&lt;/data&gt;
</pre>
<p>На днях опубликую вторую часть, где приведу код анализа этих данных, со стороны Flex.</p>
<p><strong>P.S. </strong> Сильно камнями не кидайте, так как это мой первый опыт использования <strong>mySQLi</strong> и <strong>DOM</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bushnev.com/blog/2009/11/10/flex-authorization-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

