<?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>Изучаем Web &#187; auth</title>
	<atom:link href="http://brotkin.ru/tag/auth/feed/" rel="self" type="application/rss+xml" />
	<link>http://brotkin.ru</link>
	<description>ковыряемся в Internet</description>
	<lastBuildDate>Tue, 10 Jan 2012 21:51:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Модуль Auth, каким я его вижу</title>
		<link>http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/</link>
		<comments>http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 07:41:38 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[ko3]]></category>
		<category><![CDATA[modules]]></category>

		<guid isPermaLink="false">http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/</guid>
		<description><![CDATA[Ночью опубликовал свою версию модуля Auth. Краткое описание на оф. форуме, сорцы на гитхабе.
Минздрав предупреждает!
1. Модуль еще сырой.
2. Это не официальный модуль! Если меня не закидают тухлыми помидорами, то после небольшого тестирования я его предложу англоязычной аудитории.
Ваши предложения (в комментах, на форуме или в трекере) приветствуются!

          [...]]]></description>
			<content:encoded><![CDATA[<p>Ночью опубликовал свою версию модуля Auth. <a href="http://forum.kohanaframework.org/discussion/7143/obsudim-modul-auth-/#Item_15">Краткое описание</a> на оф. форуме, <a href="http://github.com/biakaveron/new-auth">сорцы на гитхабе</a>.</p>
<p>Минздрав предупреждает!<br />
1. Модуль еще сырой.<br />
2. Это не официальный модуль! Если меня не закидают тухлыми помидорами, то после небольшого тестирования я его предложу англоязычной аудитории.</p>
<p>Ваши предложения (в комментах, на форуме или в <a href="http://github.com/biakaveron/new-auth/issues">трекере</a>) приветствуются!</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&t=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&u_data[name]=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/&bm_description=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth%2C+%D0%BA%D0%B0%D0%BA%D0%B8%D0%BC+%D1%8F+%D0%B5%D0%B3%D0%BE+%D0%B2%D0%B8%D0%B6%D1%83+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2010/11/01/modul-auth-kakim-ya-ego-vizhu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A1/A2/Acl &#8211; больше, чем Auth</title>
		<link>http://brotkin.ru/2009/09/01/a1-a2-acl/</link>
		<comments>http://brotkin.ru/2009/09/01/a1-a2-acl/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 06:37:43 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[cправочник]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[modules]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=251</guid>
		<description><![CDATA[На электронную почту пришло письмо с просьбой более подробно (и менее сумбурно) описать набор модулей A1/A2/Acl, которые я упоминал ранее. Поскольку Ko3 пока что не предоставляет достаточно поводов для &#8220;блогомарательства&#8221;, предлагаю остановиться на данном замечательном инструменте.
О чем вообще речь?
Модули A1/A2/Acl предназначены для управления правами доступа пользователей. Дистрибутив Kohana v2.3 предоставляет нам только модуль Auth, который [...]]]></description>
			<content:encoded><![CDATA[<p>На электронную почту пришло письмо с просьбой более подробно (и менее сумбурно) описать набор модулей <strong>A1/A2/Acl</strong>, которые я упоминал <a href="http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/">ранее</a>. Поскольку <strong>Ko3</strong> пока что не предоставляет достаточно поводов для &#8220;блогомарательства&#8221;, предлагаю остановиться на данном замечательном инструменте.</p>
<h2>О чем вообще речь?</h2>
<p>Модули <strong>A1/A2/Acl</strong> предназначены для управления правами доступа пользователей. Дистрибутив <strong>Kohana v2.3</strong> предоставляет нам только модуль <strong>Auth</strong>, который <a href="http://brotkin.ru/2009/07/03/razbiraem-modul-auth/">позволит</a> контролировать минимальные доступные действия &#8211; <a href="http://brotkin.ru/2009/01/26/auth_example1/">регистрация</a>, <a href="http://brotkin.ru/2009/01/29/auth_example2/">вход (<em>login</em>) и выход (<em>logout</em>)</a>. Но ведь помимо этого пользователь взаимодействует с различными объектами (ресурсами) сайта, и эти взаимодействия должны быть каким-то образом регламентированы. Самый простой пример &#8211; блог. Гости должны иметь возможность читать записи, авторизованные пользователи также могут комментировать, а администратор (владелец блога) &#8211; создавать записи и редактировать комментарии.</p>
<h2>Подготовка к работе</h2>
<p>Для ветки <strong>2.3.x</strong> модули расположены <a href="http://github.com/Wouterrr/kohanamodules2.3.2/tree/master">здесь</a>. Нас интересуют модули <strong>A1</strong>, <strong>A2</strong> и <strong>Acl</strong>, а также демка с примером возможностей модулей <strong>A2</strong> и <strong>Acl</strong> (она называется <strong>a2-acl-demo</strong>). Просто подкладываем их в папку <em>MODPATH</em> и добавляем в список модулей в <em>config.php</em>. Если запустить метод <strong>db</strong> контроллера <strong>a2demo</strong> (<em>http://localhost/a2demo/db</em>), то мы увидим минимально необходимую схему БД для дальнейшей работы с демо-модулем:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">IF <span style="color: #CC0099; font-weight: bold;">NOT</span> EXISTS</span> <span style="color: #008000;">`users`</span> <span style="color: #FF00FF;">&#40;</span>
		  <span style="color: #008000;">`id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">12</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #FF9900; font-weight: bold;">auto_increment</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`username`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">32</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #008000;">''</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`password`</span> <span style="color: #000099;">char</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">50</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`token`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">32</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`logins`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #008000;">'0'</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`last<span style="color: #008080; font-weight: bold;">_</span>login`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`role`</span> <span style="color: #999900; font-weight: bold;">enum</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'user'</span><span style="color: #000033;">,</span><span style="color: #008000;">'admin'</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
		  <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span>  <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
		  <span style="color: #FF9900; font-weight: bold;">UNIQUE</span> <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`uniq<span style="color: #008080; font-weight: bold;">_</span>username`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`username`</span><span style="color: #FF00FF;">&#41;</span>
		<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span><span style="color: #990099; font-weight: bold;">InnoDB</span>  <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span>
&nbsp;
		<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">IF <span style="color: #CC0099; font-weight: bold;">NOT</span> EXISTS</span> <span style="color: #008000;">`blogs`</span> <span style="color: #FF00FF;">&#40;</span>
		  <span style="color: #008000;">`id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">12</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #FF9900; font-weight: bold;">auto_increment</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">12</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
		  <span style="color: #008000;">`text`</span> <span style="color: #999900; font-weight: bold;">text</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
		  <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span>  <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
		  <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span>
		<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span><span style="color: #990099; font-weight: bold;">InnoDB</span>  <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span></pre></div></div>

<p></code></p>
<p>Т.е. необходимо создать таблицу для пользователей (она несильно отличается от используемой в <strong>Auth</strong>) и таблицу для сохранения наших разделяемых ресурсов (т.е. записей блога). Естественно, для настоящего блога эта табличка уж очень неактуальна, но сейчас цель &#8211; показать принцип работы модулей. Сами таблицы можно не заполнять &#8211; демо-контроллер позволит нам зарегистрироваться и немного поработать над блогом.</p>
<h2>Знакомство с демо-версией</h2>
<p>Откроем <em>http://localhost/a2demo/</em>. Поскольку мы не представились системе, нам предлагают войти или зарегистрироваться.<br />
<div id="attachment_252" class="wp-caption aligncenter" style="width: 291px"><a href="http://brotkin.ru/wp-content/uploads/login.jpg"><img src="http://brotkin.ru/wp-content/uploads/login.jpg" alt="Блок авторизации для гостя" title="Блок авторизации для гостя" width="281" height="38" class="size-full wp-image-252" /></a><p class="wp-caption-text">Блок авторизации для гостя</p></div><br />
Выберем второй вариант и получим следующую форму<br />
<div id="attachment_253" class="wp-caption aligncenter" style="width: 363px"><a href="http://brotkin.ru/wp-content/uploads/register1.jpg"><img src="http://brotkin.ru/wp-content/uploads/register1.jpg" alt="Форма для регистрации" title="Форма для регистрации" width="353" height="107" class="size-full wp-image-253" /></a><p class="wp-caption-text">Форма для регистрации</p></div><br />
Как мы видим, необходимо ввести логин, пароль (дважды) и указать роль. Доступна роль обычного пользователя (<em>user</em>) и администратора (<em>admin</em>). Ниже выведена информация о содержимом массива <strong>$_POST</strong> и переменной <strong>$user</strong>, в которой будет сохранен пользователь. Не обращайте на нее внимания <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
После успешной регистрации мы автоматически авторизовываемся и отправляемся на главную страницу демки. Теперь мы можем собственно управлять ресурсами. Вот так выглядит страница глазами обычного пользователя (я уже создал несколько записей в блоге):<br />
<div id="attachment_255" class="wp-caption aligncenter" style="width: 395px"><a href="http://brotkin.ru/wp-content/uploads/user_actions1.jpg"><img src="http://brotkin.ru/wp-content/uploads/user_actions1.jpg" alt="Что видит пользователь" title="Что видит пользователь" width="385" height="240" class="size-full wp-image-255" /></a><p class="wp-caption-text">Что видит пользователь</p></div><br />
Помимо собственно добавления записей предлагается изменить или удалить существующие. Конечно, только администратор имеет возможность управлять всеми записями &#8211; пользователь может редактировать или удалять только свои записи.</p>
<p>А теперь пришло время разобраться, как это все работает.</p>
<blockquote><p>Второй демо-контроллер, описывающий работу модуля <strong>Acl</strong>, я тут показывать не буду, т.к. он гораздо менее информативен. После прочтения данной статьи Вы можете проанализировать его самостоятельно.</p></blockquote>
<h2>A1: аутентификация</h2>
<p>Если Вы знакомы с модулем <strong>Auth</strong>, то все здесь будет понятно. Библиотека <strong>A1</strong> предоставляет базовые методы <em>login()</em>, <em>logout()</em> и <em>get_user()</em>. Все знакомо. Настройка библиотеки хранится в конфигурационном файле (его имя передается в конструктор, по умолчанию &#8216;<em>a1</em>&#8216;). Там тоже все более-менее понятно, новым для нас будет ключ &#8216;<em>columns</em>&#8216;:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Table column names
 */</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'columns'</span><span style="color: #009900;">&#93;</span>   <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'username'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span>    <span style="color: #666666; font-style: italic;">//username</span>
	<span style="color: #0000ff;">'password'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span>    <span style="color: #666666; font-style: italic;">//password</span>
	<span style="color: #0000ff;">'token'</span>    	<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'token'</span><span style="color: #339933;">,</span>  			<span style="color: #666666; font-style: italic;">//token</span>
	<span style="color: #0000ff;">'last_login'</span><span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'last_login'</span><span style="color: #339933;">,</span>  <span style="color: #666666; font-style: italic;">//last login (optional)</span>
	<span style="color: #0000ff;">'logins'</span>    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'logins'</span> 			<span style="color: #666666; font-style: italic;">//login count (optional)</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
Как понятно из названия, тут описываются имена столбцов в БД. Из обязательных только первые три (если не планируется использовать &#8220;запоминание&#8221; пользователей, то и &#8216;<em>token</em>&#8216; не нужен). Это нужно для совместимости со сторонними таблицами пользователей.</p>
<p>В модуле определена абстрактная модель <strong>A1_User</strong>, от которой необходимо будет наследовать модель для реальной таблицы пользователей (по аналогии с <strong>Auth</strong>, там была абстрактная модель <strong>Auth_User</strong>). Имя модели пользователя указывается в параметре &#8216;<em>user_model</em>&#8216; (по умолчанию конечно же &#8216;<em>user</em>&#8216;).</p>
<h2>Acl: списки управления доступом</h2>
<p>Библиотека <strong>Acl</strong> пришла в <strong>Kohana</strong> из фреймворка <a href="http://framework.zend.com/manual/ru/zend.acl.html"><strong>Zend</strong></a> и предполагает работу с тремя базовыми терминами: роль, ресурс и действие. Например, в условии &#8220;редактирование администратором записи в блоге&#8221; ролью будет &#8216;<em>admin</em>&#8216;, действием &#8211; &#8216;<em>edit</em>&#8216; (редактирование), а ресурсом &#8211; запись в блоге (&#8216;<em>blog</em>&#8216;). Термины абстрактны, т.е. под записью в блоге будет рассматриваться любая запись, независимо от условий ее создания (автор, дата и т.д.), а под ролью &#8216;<em>admin</em>&#8216; &#8211; любой пользователь с данной ролью. Данные три термина объединяются в правила, которые определяют порядок взаимодействия с ресурсами. При этом все, что не разрешено &#8211; запрещено.</p>
<p>Сперва объявляем известные нам роли и ресурсы:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// создаем объект Acl</span>
<span style="color: #000088;">$acl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Acl<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// добавляем роли</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_role</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// гость</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_role</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// пользователь</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_role</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// администратор</span>
<span style="color: #666666; font-style: italic;">// добавляем ресурсы</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// блог</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'comment'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// комментарий</span></pre></div></div>

<p></code></p>
<p>Правила добавляются с помощью методов <em>allow()</em> и <em>deny()</em> объекта <strong>Acl</strong>:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// изначально все запрещено</span>
<span style="color: #666666; font-style: italic;">// писать необязательно, привел для примера</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//  все могут читать все</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'read'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// пользователь и админ могут писать комментарии</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// админ может писать в блог</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
В правилах сперва указывается роль (или массив ролей), затем ресурс (или ресурсы), потом &#8211; действие (действия). Вместо перечисления всех ролей/ресурсов/действий можно указать <strong>NULL</strong> (так мы дали права на чтение в примере выше). Есть еще и четвертый параметр, но о нем поговорим отдельно.</p>
<blockquote><p>Поскольку по умолчанию все запрещено, мы идем по пути &#8220;добавляем все, что можно&#8221;. Другой вариант &#8211; можно разрешить все (<code>$acl->allow(NULL, NULL, NULL)</code>), а затем добавить запрещающие правила. Главный минус &#8211; потом можно легко об этом забыть и оставить дыры в защите.</p></blockquote>
<p>Проверяем права доступа:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_allowed</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// false</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_allowed</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_allowed</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true</span></pre></div></div>

<p></code></p>
<h3>Использование иерархии</h3>
<p>Перечисление всех имеющихся ролей и ресурсов при добавлении правил может превратиться в весьма утомительное занятие. Поэтому библиотека предоставляет возможность построения иерархий с наследованием правил от предка к потомку. Давайте переделаем вышеописанный пример:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// создаем объект Acl</span>
<span style="color: #000088;">$acl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Acl<span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// добавляем роли</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_role</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// гость</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_role</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'guest'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// пользователь</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_role</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// администратор</span>
<span style="color: #666666; font-style: italic;">// добавляем ресурсы</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// абстрактный ресурс</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// блог</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'text'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// комментарий</span></pre></div></div>

<p></code><br />
 Как видно, была построена иерархия ролей (гость -> пользователь -> админ) и ресурсов (текст -> блог и текст -> коммент). Теперь все правила, примененные для гостя, будут доступны и пользователю с админом, а правила для текста могут быть использованы блогом и комментарием. Соответственно так теперь будем добавлять правила:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//  все могут читать все</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'read'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// пользователь и админ могут писать комментарии</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// админ может писать в блог</span>
<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
Если в правиле указан предок, потомков можно убирать (наследование в чистом виде). В первом правиле я заменил <strong>NULL</strong> на &#8216;<em>text</em>&#8216; &#8211; результат тот же, но само правило более четкое. Например, если добавится новый ресурс &#8216;<em>stats</em>&#8216;, который должен быть разрешен только администраторам, общее правило с <strong>NULL</strong> позволит любому пользователю получить доступ. В общем, не ленитесь уточнять правила, чтобы потом после разрастания проекта это где-нибудь не аукнулось.</p>
<h3>Проверка объектов</h3>
<p>До этого мы говорили про абстрактные ресурсы и роли (в виде строк). Однако библиотека поддерживает передачу объектов, например можно использовать что-то вроде <code>$acl->is_allowed($user,  'comment', 'write');</code> В этом случае объект <em>$user</em> (в данном случае имелся в виду экземпляр <strong>ORM</strong>-модели <strong>User_Model</strong>) должен реализовывать интерфейс <em>Acl_Role_Interface</em>, что заключается в наличии метода <em>get_role_id()</em>:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> User_Model <span style="color: #000000; font-weight: bold;">extends</span> A1_User_Model implements Acl_Role_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get_role_id<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">// мы должны вернуть значение роли</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">role</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>В данном случае возвращается значение поля <em>role</em>, т.к. оно присутствует в реализации библиотеки <strong>A1</strong>. Если говорить про <strong>Auth</strong>, там пришлось бы возвращать массив ролей из таблицы <em>roles</em>. Аналогично можно передавать ресурсы, только для них интерфейс называется <em>Acl_Resource_Interface</em>, а необходимый метод &#8211; <em>get_resource_id()</em>.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Blog_Model <span style="color: #000000; font-weight: bold;">extends</span> ORM implements Acl_Resource_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get_resource_id<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<h3>Assertions</h3>
<p>Казалось бы, зачем нам все эти сложности с передачей объектов, если правила <strong>Acl</strong> поддерживают только абстрактные строки? И вот тут на сцену выходят т.н. <em>assertions</em> (что-то вроде триггеров, дальше я буду использовать именно такой термин). Данные триггеры позволяют совершать дополнительные проверки с полученными объектами. Вот как реализовывается разрешение редактирования собственных комментов пользователем:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'edit'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Acl_Assert_Argument'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'user_id'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> </code><br />
В результате при проверке <code>$acl->is_allowed($user, $comment, 'edit')</code> будет выполнена проверка на равенство <code>$user->id</code> и <code>$comment->user_id</code> (т.е. на принадлежность комментария текущему пользователю). <em>Acl_Assert_Argument</em> &#8211; это имеющийся в модуле <strong>Acl</strong> класс, позволяющий связывать между собой поля из моделей роли (в данном случае это модель <strong>User_Model</strong>, поле <em>id</em>) и ресурса (<strong>Comment_Model</strong>, поле <em>user_id</em>). Имена полей передаются в виде массива после имени класса. Можно использовать несколько связок, например так:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'edit'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Acl_Assert_Argument'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'user_id'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'something_else'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'other_field'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p> </code><br />
Если все пары полей равны между собой, проверка вернет <strong>TRUE</strong> и доступ будет получен.</p>
<p>Конечно, это очень простой пример триггера, который не может решить всех проблем. Давайте попробуем реализовать простую проверку &#8211; создавать блог может только пользователь с количеством комментариев больше 100.</p>
<p><strong>1</strong>. Каждый класс-триггер должен реализовывать интерфейс <em>Acl_Assert_Interface</em>. Это заключается в необходимости реализовать метод <em>assert()</em>, объявленный в интерфейсе следующим образом:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">assert</span><span style="color: #009900;">&#40;</span>Acl <span style="color: #000088;">$acl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$role</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resource</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$privilege</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
Собственно говоря, данный метод как раз и вызывается при проверке правила. Таким образом, получим первый шаг на пути к созданию триггера:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Acl_Assert_Comments implements Acl_Assert_Interface <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">assert</span><span style="color: #009900;">&#40;</span>Acl <span style="color: #000088;">$acl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$role</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resource</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$privilege</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code><br />
<strong>2</strong>.Если необходимо предварительно настроить триггер (в примере выше сперва должны были быть созданы соответствия пар полей из объектов роли и ресурса), используем конструктор. При создании правила, как мы помним, передается дополнительный параметр, который мы и будем обрабатывать:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Acl_Assert_Comments implements Acl_Assert_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	protected <span style="color: #000088;">$comments_required</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span> AND <span style="color: #000088;">$arguments</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$arguments</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comments_required</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">assert</span><span style="color: #009900;">&#40;</span>Acl <span style="color: #000088;">$acl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$role</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resource</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$privilege</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code><br />
Мы сохраняем переданное в конструктор значение (количество комментариев для ведения записей в блоге) в свойстве <em>$comments_required</em>. Далее в методе <em>assert()</em> оно будет использовано.<br />
<strong>3</strong>. Осталось только реализовать сравнение количества комментов у пользователя с сохраненным значением:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Acl_Assert_Comments implements Acl_Assert_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	protected <span style="color: #000088;">$comments_required</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span> AND <span style="color: #000088;">$arguments</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$arguments</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comments_required</span> <span style="color: #339933;">=</span> <span style="color: #990000;">intval</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">assert</span><span style="color: #009900;">&#40;</span>Acl <span style="color: #000088;">$acl</span><span style="color: #339933;">,</span> <span style="color: #000088;">$role</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resource</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$privilege</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$role</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comment_count</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comments_required</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<blockquote><p>В данном примере поле <em>comment_count</em> присутствует в таблице <em>users</em>, так как я стараюсь избавиться от регулярного пересчета подобных статистических данных. Естественно, никто не мешает использовать что-то вроде <code>$role->comments->count()</code>.</p></blockquote>
<p><strong>4</strong>. Вот и все, триггер создан и работает &#8211; можете проверять. Добавление правила будет выглядеть так:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$acl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span>  <span style="color: #000000; font-weight: bold;">new</span> Acl_Assert_Comments<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<h2>A2</h2>
<p>По сути рассмотренные выше классы <strong>A1</strong> и <strong>Acl</strong> между собой никак не свзяаны &#8211; один отвечает за &#8220;узнавание&#8221; пользователя, а второй &#8220;ставит его на место&#8221;. Для удобства работы с ними был создан класс-обертка <strong>A2</strong>. Он является потомком класса <strong>Acl</strong> и имеет все те же методы для работы с правилами. В качестве дополнения он агрегирует объект <strong>A1</strong>, что позволяет работать с текущим пользователем напрямую.<br />
Какие методы нам предоставляет класс <strong>A2</strong>:<br />
<strong>1</strong>. Разнообразные варианты создания объекта ( <em>__construct()</em>, <em>factory()</em> и <em>instance()</em> ). Все они принимают в качестве единственного параметра <em>$config_name</em> &#8211; имя файла конфигурации (об этом чуть ниже).<br />
2. Методы для работы с объектом <strong>A1</strong>.<br />
2.1. Метод <em>logged_in()</em> перенаправляет вызов к объекту <strong>A1</strong>, в результате получаем проверку залогиненности пользователя.<br />
2.2. Метод <em>get_user()</em> таким же макаром возвращает сам объект модели пользователя (обычно это <strong>User_Model</strong>).<br />
3. Метод <code>allowed($resource = NULL, $privilige = NULL)</code> проверяет, может ли текущий пользователь иметь возможность применить к ресурсу <em>$resource</em> действие <em>$privilige</em>. Таким образом, можно не передавать вручную в объект <strong>Acl</strong> пользователя, а использовать вот такую сокращенную запись.</p>
<h3>Конфигурация</h3>
<p>Самое интересное, что наверняка бросилось в глаза &#8211; наличие некого параметра <em>$config_name</em> в конструкторе. Да-да, можно не прописывать правила, роли и ресурсы в контроллере, а использовать заранее сохраненные настройки. Вот так вот будут выглядеть настройки, описанные нами выше:<br />
 <code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'roles'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'user'</span>			<span style="color: #339933;">=&gt;</span>	<span style="color: #0000ff;">'guest'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'admin'</span>			<span style="color: #339933;">=&gt;</span>	<span style="color: #0000ff;">'user'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'guest_role'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'guest'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resources'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'text'</span>			<span style="color: #339933;">=&gt;</span>	<span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'blog'</span>			<span style="color: #339933;">=&gt;</span>	<span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'comment'</span>		<span style="color: #339933;">=&gt;</span>	<span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rules'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'allow'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
	<span style="color: #009900;">&#40;</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'read'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'comment'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'write'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Acl_Assert_Comments'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
Все довольно просто и понятно. Параметр <code>$config['guest_role']</code> определяет имя роли, которая будет использоваться, если никто не залогился. Есть еще один дополнительный параметр, определяющий библиотеку для работы с аутентификацией (я говорил про <strong>A1</strong>, но ведь и <strong>Auth</strong> никто не отменял):<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'a1'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'A1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
Если планируется использование другой библиотеки, то необходимо убедиться, что она реализует метод <em>get_user()</em> для получения текущего пользователя, а также использует шаблон <strong>Singleton</strong> &#8211; т.е. имеет статический метод <em>instance()</em>. В качестве параметра после имени библиотеки можно указать аргументы для передачи в метод <em>instance()</em>, обычно это имя конфигурации библиотеки. Сам объект будет сохранен в свойстве <em>$a1</em> (оно объявлено как <em>public</em>).</p>
<h2>Постскриптум</h2>
<p>Вот собственно и все. В использовании <strong>A2</strong> похожа на <strong>Acl</strong>, дополнительные возможности я указал. Самая неочевидная ошибка, на которую сам неоднократно напарывался &#8211; частенько забывал в моделях ролей и ресурсов реализовывать интерфейсы <em>Acl_Role_Interface</em> и <em>Acl_Resource_Interface</em> &#8211; они должны возвращать имя соответственно текущей роли (метод <em>get_role_id()</em>) или ресурса (<em>get_resource_id()</em>).</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/09/01/a1-a2-acl/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/09/01/a1-a2-acl/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/09/01/a1-a2-acl/&t=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/09/01/a1-a2-acl/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/09/01/a1-a2-acl/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/09/01/a1-a2-acl/&u_data[name]=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/09/01/a1-a2-acl/&title=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/09/01/a1-a2-acl/&bm_description=A1%2FA2%2FAcl+-+%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B5%2C+%D1%87%D0%B5%D0%BC+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/09/01/a1-a2-acl/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ORM v3.0: что будет?</title>
		<link>http://brotkin.ru/2009/08/27/orm-v30-chto-budet/</link>
		<comments>http://brotkin.ru/2009/08/27/orm-v30-chto-budet/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 09:21:51 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=250</guid>
		<description><![CDATA[Не так давно разработчик jheathco опубликовал коммит со множеством важных изменений в механизме ORM. Одно  из самых главных &#8211; отказ от свойств $has_and_belongs_to_many и $has_many_through. И если $has_many_through может быть использован через $has_many (с указанием имени промежуточной модели в качестве дополнительного параметра), то HABTM в чистом виде нам недоступен. Честно говоря, не самое однозначное [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно разработчик <em>jheathco</em> опубликовал <a href="http://github.com/jheathco/kohana-orm/commit/4c593bea36cf65d5e48f4afae5bb87dc24ec8d8a">коммит</a> со множеством важных изменений в механизме <strong>ORM</strong>. Одно  из самых главных &#8211; отказ от свойств <strong>$has_and_belongs_to_many</strong> и <strong>$has_many_through</strong>. И если <strong>$has_many_through</strong> может быть использован через <strong>$has_many</strong> (с указанием имени промежуточной модели в качестве дополнительного параметра), то <strong>HABTM</strong> в чистом виде нам недоступен. Честно говоря, не самое однозначное решение &#8211; минусы очевидны.</p>
<p>Кроме того, практически завязанный на <strong>ORM</strong> модуль <strong>Auth</strong> также &#8220;подвисает&#8221;. Включенная в <em>RC3</em> версия как таковая непригодна к использованию (интересно, зачем <em>Shadowhand</em> вообще добавил его, зная об этом?). Сейчас имеется более-менее работоспособная <a href="http://github.com/isaiahdw/kohana-auth/tree/master">версия</a> на гитхабе, однако для вместе с ней придется подключать <a href="http://github.com/isaiahdw/kohana-orm/tree">альтернативную версию</a> <strong>ORM</strong> (это форк от оригинальной, однако сделаны некоторые необходимые изменения, убирающие известные баги). Основные методы (login/logout, &#8220;запоминание&#8221; пользователя при логине) должны работать.</p>
<p>В ожидании релиза 3.0 не самые радужные перспективы&#8230; Будем ждать стабильности в двух популярных модулях.</p>
<p><strong>PS</strong>. Кстати, чем радует версия <em>jheathco</em> &#8211; наличие описания на <a href="http://wiki.github.com/jheathco/kohana-orm">вики-странице</a> проекта.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&t=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&u_data[name]=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&title=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/08/27/orm-v30-chto-budet/&bm_description=ORM+v3.0%3A+%D1%87%D1%82%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/08/27/orm-v30-chto-budet/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Разбираем модуль Auth.</title>
		<link>http://brotkin.ru/2009/07/03/razbiraem-modul-auth/</link>
		<comments>http://brotkin.ru/2009/07/03/razbiraem-modul-auth/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 13:03:13 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[cправочник]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[хеш]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=243</guid>
		<description><![CDATA[Давно не писал про Kohana 2.3.x. Увлекся третьей версией, забросил (надеюсь, временно) написание форума как части CMS, в общем стыдно стало.   Решил разобрать по косточкам наверное самый популярный модуль из дистрибутива, речь пойдет конечно же о модуле Auth.
Что внутри?
Загляните в директорию MODPATH/auth:

auth
   &#124;---config
   &#124;      [...]]]></description>
			<content:encoded><![CDATA[<p>Давно не писал про <strong>Kohana 2.3.x</strong>. Увлекся третьей версией, забросил (надеюсь, временно) написание форума как части <strong>CMS</strong>, в общем стыдно стало. <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Решил разобрать по косточкам наверное самый популярный модуль из дистрибутива, речь пойдет конечно же о модуле <strong>Auth</strong>.<span id="more-243"></span></p>
<h3>Что внутри?</h3>
<p>Загляните в директорию <em>MODPATH/auth</em>:</p>
<pre>
<strong>auth</strong>
   |---<strong>config</strong>
   |       |-----auth.php
   |
   |---<strong>libraries</strong>
   |       |-----<strong>drivers</strong>
   |       |           |-----<strong>Auth</strong>
   |       |           |           |---file.php
   |       |           |           |---orm.php
   |       |           |
   |       |           |-----auth.php
   |       |
   |       |-----auth.php
   |
   |---<strong>models</strong>
           |-----auth_role.php
           |-----auth_user.php
           |-----auth_user_token.php
           |-----role.php
           |-----user.php
           |-----user_token.php
</pre>
<h3>Конфигурация</h3>
<p>Конфигурационный файл <em>config/auth.php</em> содержит немногочисленные настройки модуля:</p>
<ul>
<li><strong>$config['driver']</strong> &#8211; используемый тип драйвера. В комплекте есть <strong>ORM</strong> и файлы (<strong>file</strong>). О них чуть позже.</li>
<li><strong>$config['hash']</strong> &#8211; алгоритм для получения хешей. Нужен для безопасного хранения паролей в хранилище (БД или файлы). По умолчанию <strong>sha1</strong>, может быть использован любой из списка методов, полученных в результате работы функции <a href="http://ru.php.net/hash_algos">hash_algos()</a>.</li>
<li><strong>$config['salt_pattern']</strong> &#8211; т.н. &#8220;<em>соль</em>&#8221; хеша. По сути это номера смещений в строке с паролем, куда будут вставлены дополнительные символы, усложняющие взлом хешированного пароля.</li>
<li><strong>$config['lifetime']</strong> &#8211; время жизни <strong>cookie</strong> в секундах. Если Вы предоставляете возможность логина с &#8220;запоминанием&#8221; (т.е. чтобы в следующий раз не вводить заново логин и пароль), то данный параметр определяет время, в течении которого в браузере сохранятся данные. По умолчанию 1209600 секунд (две недели).</li>
<li><strong>$config['session_key']</strong> &#8211; имя ключа для хранения текущего пользователя в сессии. По умолчанию &#8216;<em>session_key</em>&#8216; (т.е. будет доступен как <em>$_SESSION['session_key']</em>).</li>
<li><strong>$config['users']</strong> &#8211; массив с первоначально доступными пользователями, если планируется использование драйвера <em>file</em>. По умолчанию пустой, но есть закомментированная строка с пользователем &#8216;<em>admin</em>&#8216; и паролем &#8216;<em>admin</em>&#8216; (в конфиге хранится не сам пароль, а его хеш).</li>
</ul>
<blockquote><p>Класс <strong>Auth</strong>, как уже было сказано ранее, позволяет работать с различными способами хранения и обработки данных, для этого используются драйверы. Однако имеющийся драйвер на основе файлов имеет очень ограниченные возможности (практически только <em>login</em>/<em>logout</em>), данные о пользователях состоят только их логина и пароля, хранятся в текстовых файлах (точнее в упомянутом ранее <em>$config['users']</em>) и подгружаются все сразу. Поэтому обычно они в документации не фигурируют. А вот <strong>ORM</strong>-драйвер намного более продуктивен, так что в дальнейшем будем рассматривать только его использование.</p></blockquote>
<p>Рассмотрим основные возможности библиотеки <strong>Auth</strong> на примере типовых действий пользователя. Поскольку обычно работа с пользователями проводится во всех контроллерах проекта, удобно в базовом контроллере сохранять экземпляр объекта <strong>Auth</strong>, чтобы в дальнейшем использовать его как свойство (<em>property</em>) контроллера, например так:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span> <span style="color: #339933;">=</span> Auth<span style="color: #339933;">::</span><span style="color: #004000;">instance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<h3>Предисловие. Хеши, соли и прочие пряности</h3>
<p>Заходу на сайт конечно же должна предшествовать регистрация. А после регистрации пользователя необходимо сохранить пароль, но не в явном же виде! Поэтому используются различные алгоритмы <a href="http://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">хеширования</a>. В <strong>Kohana</strong> используется шифрование с применением &#8220;<em>соли</em>&#8220;, что увеличивает сложность расшифровки хранимого пароля. Давайте рассмотрим такой код:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// в файле config/auth.php</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'salt_pattern'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'1, 3, 5, 9, 14, 15, 20, 21, 28, 30'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// в тестовом методе</span>
<span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123456789abcdefg'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hash</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hash_password</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Данный пример в результате выведет что-то вроде<br />
<code>'e8dabc6b7e1fb46b08d591c66dde7fb783a1dbe4'<br />
'c66692385b1c5aaefef96fc9d94f4a56ee72f63bd8375a4a07'</code></p>
<p>Если вы несколько раз обновите страницу, то станет заметно, что первая строка не изменяется, а вторая каждый раз разная. Дело в том, что в первой выводится результат простого хеширования введенного пароля (метод <strong>hash($password)</strong>), он больше ни от чего не зависит. Во втором же случае мы применяем хеширование с &#8220;<em>солью</em>&#8220;, в результате чего хеш становится совершенно другим.</p>
<p>Итак, это делается в методе <strong>hash_password($password, $salt = FALSE)</strong>. Первый параметр ясен &#8211; это пароль в первоначальном виде (нешифрованный). Второй параметр &#8211; строка с &#8220;<em>солеными</em>&#8221; символами. После регистрации данный метод вызывается без параметра <em>$salt</em>, и соль генерируется автоматически (берется хеш от случайного <a href="http://ru.wikipedia.org/wiki/GUID">GUID</a> и обрезается до количества элементов в параметре <em>$config['salt_pattern']</em>). Далее самое интересное &#8211; соль вставляется в строку с паролем в качестве префикса (т.е. получается <em>$salt.$password</em>) и все это отправляется в метод <strong>hash()</strong>. Полученный в результате хеш дополнительно разбавляется символами &#8220;<em>соли</em>&#8221; в местах, указанных параметром <em>$config['salt_pattern']</em> (например, если в паттерне первым элементом идет единица, то после первого символа пароля будет вставлен один символ &#8220;<em>соли</em>&#8220;).</p>
<p>Понятно? Если да, то вы наверное ошиблись сайтом. <img src='http://brotkin.ru/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' />  Проще всего рассмотреть пример, показывающий этапы вычисления хеша:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// пароль</span>
<span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'123456789abcdefg'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// соль</span>
<span style="color: #000088;">$salt</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'0000000000'</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// соль после хеширования, урезанная до нужной длины</span>
<span style="color: #000088;">$hashed_salt</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hash</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$salt</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$salt</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// простой хэш пароля</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hash</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// хэш соли</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$hashed_salt</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// хэш строки из соли и пароля</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hash</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$hashed_salt</span><span style="color: #339933;">.</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// хэш строки из соли и пароля с &quot;вкраплениями соли&quot;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hash_password</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hashed_salt</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>На выходе получим такие строки:<br />
<code><br />
e8dabc6b7e1fb46b08d591c66dde7fb783a1dbe4<br />
8104ba1dc0<br />
0171bfa8e8a0450af6972cc61c6c20407a65bf47<br />
081711b0fa8e48a045b0aaf69712dcc61c6cc200407a65bf47<br />
</code><br />
На первую можете особо не обращать внимание, она просто показывает, насколько далек обычный хеш пароля от полученного с применением &#8220;<em>соли</em>&#8220;. Вторая строка &#8211; это используемый хеш &#8220;<em>соли</em>&#8220;, из него берутся символы для вставки в хеш пароля. Например, первый символ (цифра восемь) будет вставлен после первого символа пароля (так указано в <em>salt_pattern</em>). Третья строка &#8211; это практически итоговый хеш, но до вставки элементов &#8220;<em>соли</em>&#8220;. Он отличается от хеша просто пароля, т.к. в начало строки была вставлена переменная <em>$hashed_salt</em>. Ну, а между третьей и четвертой строкой даже видно сходство. Итоговый хеш &#8220;разбух&#8221; еще на 10 символов (столько элементов в <em>salt_pattern</em>), места вставки <em>&#8220;крупиц соли&#8221;</em> вы легко увидите. Надеюсь, что теперь стало понятнее.</p>
<blockquote><p>Надеюсь, вы понимаете, что с разной &#8220;<em>солью</em>&#8220;. получатся разные хеши. Более того, важна не только сама строка с &#8220;<em>солью</em>&#8220;, но и параметр <em>$config['salt_pattern']</em>. </p></blockquote>
<h3>Еще одно предисловие. Роли</h3>
<p>Драйвер <strong>ORM</strong> предусматривает использование ролей. У каждого пользователя может быть свой набор ролей, определяющий доступные или запрещенные действия. Например, для удачной авторизации помимо совпадения паролей необходимо наличие роли &#8220;<em>login</em>&#8220;. Это очень удобно, когда надо лишить пользователя возможности войти на сайт, но и удалять неохота (этакий бан). Для входа в &#8220;админку&#8221; обычно добавляется роль &#8220;<em>admin</em>&#8221; и т.д. Можно создавать роли и для исключения каких-то действий (например, на запрет написания статей/комментариев или просмотра фотогалерей).</p>
<p>Роли и пользователи между собой взаимодействуют с помощью <strong>ORM</strong>-моделей <em>Auth_User</em> и <em>Auth_Role</em>. Так как у каждого пользователя может быть несколько ролей, и роль может быть назначена разным пользователям, связь между ними &#8220;<em>много-ко-многим</em>&#8221; (<em>has_and_belongs_to_many</em>). Напомню, что для работы с таким видом связей в <strong>ORM</strong> используются методы <strong>has()</strong>, <strong>add()</strong> и <strong>remove()</strong>.</p>
<blockquote><p>Роли в <strong>Auth</strong> поддерживают метод <strong>unique_id($id)</strong>, поэтому можно использовать конструкции вида <em>ORM::factory(&#8216;role&#8217;, &#8216;login&#8217;);</em></p></blockquote>
<h3>Вход</h3>
<p>Пользователь вводит свои логин и пароль, которые передаются формой для обработки контроллером. Для проверки корректности введенных данных существует метод <strong>login($username, $password, $remember = FALSE)</strong>. Первые два параметра понятны, третий &#8211; та самая &#8220;<em>галочка</em>&#8221; для автоматического входа в дальнейшем. В нашем контроллере проверка будет происходить примерно так:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// в $_POST есть данные, значит кто-то пытается войти</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rememberme'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// логин не удался, лучше всего перезагрузить страницу</span>
		url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>Router<span style="color: #339933;">::</span><span style="color: #000088;">$current_uri</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// вошли на сайт! Надо перенаправить пользователя</span>
		url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// иначе просто показываем форму для входа на сайт</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Метод <strong>login()</strong> возвращает булевский результат <strong>TRUE</strong>/<strong>FALSE</strong>, в зависимости от которого мы либо можем смело обрабатывать пользователя как залогиненного (как правило это редикт обратно на страницу, откуда был совершен переход к форме входе), либо доложить об ошибке и предложить попробовать еще (опять же, делаем редирект на текущий <em>URL</em>, чтобы очистить массив <strong>$_POST</strong>). В первой строчке проверяется наличие <strong>POST</strong>-данных вообще, так как удобно совместить в данном методе как просто вывод формы входа, так и авторизацию.</p>
<p>А что происходит внутри метода <strong>login()</strong>? Давайте заглянем.</p>
<p>Пустые пароли не поддерживаются вообще (метод сразу возвращает <strong>FALSE</strong>).<br />
Далее необходимо сравнить пароли. Так как в БД пароль хранится в захешированном виде, надо сравнивать хеши паролей. Как уже было сказано выше, если не знать &#8220;<em>соль</em>&#8220;, использованную при первом хешировании, второй хеш того же пароля получится совершенно другим. Поэтому для извлечения &#8220;<em>соли</em>&#8221; из готового хеша используется метод <strong>find_salt($password)</strong>. Он использует указанный в конфигурации шаблон (salt_pattern) и выдергивает из хранящегося хэша символы.</p>
<blockquote><p>Теперь наверное станет понятно, почему смена <em>salt_pattern</em> приводит к потере аккаунтов &#8211; невозможно получить правильную &#8220;<em>соль</em>&#8221; из старых паролей. Это очень распространенная ошибка, даже занес ее в свой <a href="http://brotkin.ru/zametki-na-polyax/#auth">FAQ</a>&#8230;</p></blockquote>
<p>Далее все просто &#8211; сравниваем полученный хеш со старым и выдаем вердикт. В качестве бонуса различные драйверы могут выполнять дополнительные действия в случае, если логин успешный. Например, драйвер <strong>ORM</strong> дополнительно проверяет, есть ли у пользователя права на логин (для этого предусмотрены <strong>роли</strong>), надо ли запомнить данного пользователя, увеличивает счетчик входов и сохраняет время последнего логина. Кроме того, в сессии (под именем, указанным в <em>config['session_key']</em>) сохраняется объект с данными пользователя (для драйвера <strong>ORM</strong> это объект класса <strong>User_Model</strong>).</p>
<h3>Проверка авторизации</h3>
<p>Конечно, заставлять пользователя вводить логин и пароль на каждой странице глупо. Модуль <strong>Auth</strong> позволяет проверять, вошел ли на сайт пользователь или он еще пока гость. Для этого есть &#8220;висящий&#8221; в сессии объект <strong>User_Model</strong> и метод <strong>logged_in()</strong>.</p>
<p>На самом деле <strong>logged_in($role)</strong>, как видно из имени параметра, позволяет проверить не только сам факт авторизации, но и наличие требуемой роли. Если в сессии присутствует объект <strong>User_Model</strong> и выполняется условие наличия у данного объекта всех запрошенных ролей (параметр <em>$role</em> может быть и массивом ролей), то возвращается <strong>TRUE</strong>. Соответственно, можно не передавать имя роли в данный метод, будет анализироваться только содержимое сессии.</p>
<p>Опять же, удобно в конструкторе базового контроллера хранить результат проверки на авторизацию, например так:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_user</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Метод <strong>get_user()</strong> возвращает объект <strong>User_Model</strong> из сессии, если он там есть. Иначе <strong>FALSE</strong>.</p>
<h3>Выход</h3>
<p>Для выхода с сайта используется метод <strong>logout($destroy = FALSE)</strong>, который уничтожает объект <strong>User_Model</strong> из сессии, а также может и разрушить саму сессию (если параметр <em>$destroy</em> установлен в <strong>TRUE</strong>). В принципе достаточно вызова <strong>logout()</strong> без параметров. Метод возвращает <strong>TRUE</strong>/<strong>FALSE</strong>, в зависимости от успешного удаления объекта из сессии.</p>
<h3>Автологин</h3>
<p>Если используется параметр <em>$remember</em> при авторизации, модуль <strong>Auth</strong> пытается сохранить данные пользователя на указанное в <em>config['lifetime']</em> время. Вот тут-то нам пригодится стоявшая до сих пор в сторонке модель Auth_User_Token_Model (я не знаю достойного перевода для термина &#8216;token&#8217;, поэтому в дальнейшем буду его использовать как есть). <strong>Token</strong> по сути представляет из себя некий идентификатор длиной 32 символа, который сохраняется в базе данных и в куках браузера. Таким образом, в пределах времени жизни куки есть возможность сравнить эти значения и если все совпало, то дать возможность автоматически авторизоваться без ввода пароля. Для этого в объекте <strong>User_Token_Model</strong> есть связь &#8220;<em>один-ко-многим</em>&#8221; с <strong>User_Model</strong> (в виде поля <em>user_id</em>).</p>
<p>Дополнительные сведения про <em>token</em>:</p>
<ul>
<li>После каждого автоматического входа кука с <strong>User_Token_Model</strong> обновляется (в целях безопасности меняется идентификатор). Естественно обновляется и запись в БД.</li>
<li>Примерно каждый сотый <em>token</em> инициирует &#8220;чистку мусора&#8221; &#8211; запрос к БД, удаляющий все записи с истекшим сроком хранения.</li>
<li>Хранится в куке с именем &#8216;<em>authautologin</em>&#8216;.</li>
<li>При выходе (<em>logout</em>) кука удаляется &#8211; в следущий раз придется авторизовываться &#8220;как все&#8221;.</li>
</ul>
<p>Если вы хотите использовать возможность автовхода, сразу после проверки методом <strong>logged_in()</strong> добавьте вызов метода <strong>auto_login()</strong>:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logged_in</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// пользователь авторизован</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">auth_login</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// у пользователя есть кука и автологин прошел успешно</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// у нас гость</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<h3>Вход без пароля</h3>
<p>В модуле есть и &#8220;черный вход&#8221; &#8211; метод <strong>force_login($user)</strong>, позволяющий без ввода пароля авторизоваться под указанным пользователем. Может быть полезно для взгляда на проект &#8220;чужими глазами&#8221;, но лишний раз играться с такими методами опасно (ИМХО). После такого входа в сессии появляется флаг &#8216;<em>auth_forced</em>&#8216;, установленный в <strong>TRUE</strong>. Его надо анализировать перед выполнением каких-либо серьезных изменений в проекте.</p>
<p><strong>Вроде бы все</strong>, удачных вам авторизаций!</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&t=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&u_data[name]=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&title=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/07/03/razbiraem-modul-auth/&bm_description=%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Auth.+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/07/03/razbiraem-modul-auth/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Своя CMS: Возвращаясь к модулю Auth</title>
		<link>http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/</link>
		<comments>http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 21:20:40 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Пишем CMS]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=183</guid>
		<description><![CDATA[Рассмотренный нами ранее модуль Auth неплох, но недавно на форуме сообщили о создании более простого модуля аутентификации с незамысловатым названием A1. Он представляет собой облегченную версию Auth &#8211; без лишней абстракции и драйверов (т.е. мы просто явно используем ORM), без ролей (точнее роли есть, но они теперь не являются отдельными от пользователя объектами). Кроме данного [...]]]></description>
			<content:encoded><![CDATA[<p>Рассмотренный нами ранее модуль <strong>Auth</strong> неплох, но недавно на форуме <a href="http://forum.kohanaphp.com/comments.php?DiscussionID=1988&#038;page=1">сообщили</a> о создании более простого модуля аутентификации с незамысловатым названием <strong>A1</strong>. Он представляет собой облегченную версию <strong>Auth</strong> &#8211; без лишней абстракции и драйверов (т.е. мы просто явно используем <strong>ORM</strong>), без ролей (точнее роли есть, но они теперь не являются отдельными от пользователя объектами). Кроме данного модуля предлагается портированная <strong>Zend</strong>&#8216;овская библиотека <strong>Zend_Acl</strong> и созданный на ее основе модуль авторизации <strong>A2</strong>.<span id="more-183"></span></p>
<p>Для начала необходимо поработать над модулями, т.к. они были созданы под 3.0 со всеми сопутствующими препятствиями (иная структура папок, именование классов и еще несколько мелочей). Итоговый архив с небольшими доработками можно скачать <a href="http://brotkin.ru/examples/kohana_tutorials/A1_Acl_A2.rar">тут</a>. Модули разбиты на три папки, но в принципе их можно объединить в одну.</p>
<h2>Настройка</h2>
<p>Скопируйте модули и контроллер в соответствующие папки. В <em>application/config/config.php</em> не забудьте подключить модули. Кроме того, рекомендую закомментировать модуль <strong>Auth</strong> и проверить, нет ли в <em>application/models</em> моделей <strong>Auth</strong> и <strong>Blog</strong> (они присутствуют в модуле <strong>A2</strong>), т.к. они будет загружены вместо необходимым нам. Для работы прилагаемого демо-контроллера необходимы две таблицы, одна для пользователей, другая для контролируемого ресурса (блоги):<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">	<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`users`</span> <span style="color: #66cc66;">&#40;</span>
	  <span style="color: #ff0000;">`id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`username`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`password`</span> char<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`logins`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`last_login`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`role`</span> enum<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'user'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'admin'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
	  <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`uniq_username`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`username`</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB  <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8;
&nbsp;
	<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`blogs`</span> <span style="color: #66cc66;">&#40;</span>
	  <span style="color: #ff0000;">`id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`user_id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	  <span style="color: #ff0000;">`text`</span> text <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
	  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
	  <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`user_id`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`user_id`</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB  <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8;</pre></div></div>

<p></code></p>
<p>Поскольку таблица с пользователями у меня уже была, я просто добавил поле `<em>role</em>` и убрал в существующем поле `<em>email</em>` атрибут <strong>NOT NULL</strong> (данное поле в демо использоваться не будет). Если таблица `<em>users</em>` у вас тоже есть, не забудьте в файле <em>modules/a1/config/a1.php</em> привести настройки (метод хэширования, &#8220;соль&#8221; и т.д.) в соответствие с теми, что были в <em>auth.php</em> (он либо в <em>application/config/</em>, либо в  <em>modules/auth/config</em>).</p>
<p>Вот собственно и все. Запускаем <em>http://localhost/a2demo/</em> и видим предложение представиться/зарегистрироваться, а также сообщение, что блогов нет. Сперва войдем на сайт под существующем логином или зарегистрируемся. Тут все более-менее похоже на модуль <strong>Auth</strong>, разве что в выводимой <strong>Profiler</strong>&#8216;ом информации на удивление мало запросов, связанных с пользователем (как мы помним, <strong>Auth</strong> делал три запроса).</p>
<h2>Управление объектами</h2>
<p>Так для чего же нам нужны эти две дополнительные библиотеки? Если вы еще не знакомы с <strong>Zend_Acl</strong>, самое время немного <a href="http://framework.zend.com/manual/ru/zend.acl.html">почитать</a>. В общих чертах, <strong>Acl</strong> (списки доступа) &#8211; это некий набор типовых правил (&#8220;разрешить то-то&#8221;/&#8221;запретить то-то&#8221;), применяемых к отдельным классам ресурсов (в нашем случае это блоги) для текущего пользователя (точнее, для имеющихся у пользователя ролей). Так, в конфигурационном файле <em>a2.php</em> приведены правила следующего вида:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rules'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'allow'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
	<span style="color: #009900;">&#40;</span>
			<span style="color: #666666; font-style: italic;">// guest can read blog</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'read'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #339933;">...</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #339933;">...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Первый параметр &#8211; роль, второй &#8211; класс ресурса, далее имя операции. Все это разрешается (т.к. ключ &#8220;<em>allow</em>&#8220;). Аналогично существуют правила для запрета операций. Кроме того, роли пользователей выполнены в виде иерархии <em>Гость</em>-><em>Пользователь</em>-><em>Админ</em> с наследованием правил. Еще одна возможность &#8211; использование утверждений (<strong>asserts</strong>). Это правила с добавлением условий их применения (таким образом реализована проверка владельца блога при редактировании). Все правила загружаются из файла, а не из БД, хорошо это или плохо &#8211; решать вам. Мне кажется, с разрастанием приложения могут возникнуть проблемы&#8230;</p>
<p>А что насчет <strong>A2</strong>? Дело в том, что нас не всегда устраивают разрешения для целого класса ресурсов. Для отдельных экземпляров объектов в <strong>A2</strong> можно применить отдельные правила. Для этого вместо строкового названия ресурса можно использовать экземпляр конкретного ресурса (например, <strong>ORM::factory(&#8216;blog&#8217;,1)</strong>, т.е. блог с идентификатором 1).</p>
<p>Помимо настроек в конфигурационном файле мы можем редактировать правила прямо в демо-контроллере:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// разрешаем редактирование всех блогов админами</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'edit'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// добавляем для пользователей право на удаление блога с id=1</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">allow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'delete'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// запрещаем чтение блогов ВСЕМ пользователям (правила наследуются)</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">a2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">deny</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'guest'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'read'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<h2>Итог</h2>
<p>Получилось несколько сумбурно, но, надеюсь, что основную мысль я до вас донес. <img src='http://brotkin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  В любом случае скоро нам придется попробовать применить данный модуль вместо тяжеловесного <strong>Auth</strong>. И если не выявится еще какой-либо более интересный модуль, мы будем использовать именно связку <strong>A1</strong>+<strong>A2</strong>.</p>
<p><strong>PS</strong>. В настоящее время имеется полноценная и развивающаяся версия данного модуля на <a href="http://github.com/Wouterrr/kohanamodules2.3.2/tree/master">гитхабе</a> для ветки <strong>2.3</strong>.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&t=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&u_data[name]=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/&bm_description=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D1%8F%D1%81%D1%8C+%D0%BA+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E+Auth+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/02/20/svoya-cms-vozvrashhayas-k-modulyu-auth/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Представьтесь!</title>
		<link>http://brotkin.ru/2009/01/29/auth_example2/</link>
		<comments>http://brotkin.ru/2009/01/29/auth_example2/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 11:50:07 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[учебник]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=138</guid>
		<description><![CDATA[Настало время продолжить разговор о работе с модулем Auth, который мы начали вчера. Пользователя мы зарегистрировали, теперь надо пустить его на сайт под своим логином/паролем, а также позволить выйти (&#8220;разлогиниться&#8221;). Кроме того, пользователь должен видеть сайт несколько по-другому, нежели анонимный гость (как минимум, имя пользователя и ссылка на выход должны присутствовать). Этим мы и займемся [...]]]></description>
			<content:encoded><![CDATA[<p>Настало время продолжить разговор о работе с модулем <strong>Auth</strong>, который мы начали вчера. Пользователя мы зарегистрировали, теперь надо пустить его на сайт под своим логином/паролем, а также позволить выйти (&#8220;разлогиниться&#8221;). Кроме того, пользователь должен видеть сайт несколько по-другому, нежели анонимный гость (как минимум, имя пользователя и ссылка на выход должны присутствовать). Этим мы и займемся в данной статье. <span id="more-138"></span></p>
<h2>Входит и выходит&#8230; Замечательно выходит!</h2>
<p>Итак, после прошлой <a href="http://brotkin.ru/2009/01/26/auth_example1/">статьи</a> у нас имеется контроллер <strong>Auth_Controller</strong>. Давайте добавим методы <strong>login</strong> и <strong>logout</strong>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> login<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// введены данные формы</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>Auth<span style="color: #339933;">::</span><span style="color: #004000;">instance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/profile'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">else</span> <span style="color: #000088;">$errors</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'login failed!'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Авторизация пользователя'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$errors</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> logout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>Auth<span style="color: #339933;">::</span><span style="color: #004000;">instance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Все довольно просто. Проверяем входные данные (массив <strong>$_POST</strong>), если есть &#8211; пробуем войти. Используются методы <strong>login()</strong> и <strong>logout()</strong> объекта <strong>Auth</strong> (доступ к которому мы получаем через <strong>Auth::instance()</strong>, налицо реализация паттерна <a href="http://ru.wikipedia.org/wiki/Singleton">Singleton</a>). В методе <strong>login()</strong> используется представление <em>application/views/auth/login.php</em>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;?php defined<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SYSPATH'</span><span style="color: #66cc66;">&#41;</span> OR die<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'No direct access allowed.'</span><span style="color: #66cc66;">&#41;</span>; ?&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'&lt;?=url::base(FALSE)?&gt;</span></span>auth/login' id='login' method='post'&gt;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>Авторизация пользователя<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'errors'</span>&gt;&lt;?foreach<span style="color: #66cc66;">&#40;</span>$errors as $key<span style="color: #66cc66;">=</span>&gt;</span>$val):?&gt;<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;?<span style="color: #66cc66;">=</span>$key.<span style="color: #ff0000;">&quot;:&quot;</span>.$val?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;? endforeach?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'username'</span>&gt;</span>login <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'text'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'username'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'username'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;32&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span>&gt;</span>password <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;50&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Войти&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'/auth/register'</span>&gt;</span>Зарегистрироваться<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p></code></p>
<p>Все вроде стандартно. Но попробуйте войти под правильной комбинацией логина и пароля &#8211; нас перенаправит на страницу профиля&#8230; и все. Мы даже не можем определить, вошли мы или нет. Вывод: надо еще на каждой странице определять статус пользователя и отображать его где-то (я предпочитаю в &#8220;шапке&#8221; сайта). Давайте подумаем, как это можно сделать.</p>
<ul>
<li>Во-первых, объект <strong>Auth</strong> после логина пользователя сохраняет в сессии экземпляр модели <strong>User_Model</strong> (в случае ORM), имя ключа указывается в параметре <strong>$config['session_key']</strong> (т.е. по умолчанию получаем <strong>$_SESSION['auth_user']</strong>). Для любителей самостоятельно поковырять исходники &#8211; смотрите файл <em>modules/auth/libraries/drivers/auth.php</em>, метод <strong>complete_login()</strong>. </li>
<li>Во-вторых, поскольку необходимо иметь доступ к данным пользователя на каждой странице сайта, проще всего создать переменную в таком контроллере, от которого будут наследоваться все остальные контроллеры страниц. Давайте назовем его <strong>Web_Controller</strong> (файл <em>application/controllers/web.php</em>):<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> OR <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct access allowed.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Web_Controller <span style="color: #000000; font-weight: bold;">extends</span> Template_Controller <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$template</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'test'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Auth<span style="color: #339933;">::</span><span style="color: #004000;">instance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logged_in</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'header/guest'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'auth_user'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'header/logged'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">menus</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
      <span style="color: #009900;">&#40;</span>
          <span style="color: #990000;">array</span>
          <span style="color: #009900;">&#40;</span>
              <span style="color: #0000ff;">'title'</span>   <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">'Главная страница блога'</span><span style="color: #339933;">,</span>
              <span style="color: #0000ff;">'link'</span>    <span style="color: #339933;">=&gt;</span>  url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'blog/'</span><span style="color: #339933;">,</span>
          <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></li>
</ul>
<p>Итак, мы вынесли в базовый контроллер проверку, вошел ли пользователь, результат хранится в переменной <strong>$this->user</strong>. В зависимости от этого мы в шапку сайта вставляем предложение войти либо информацию о текущем пользователе и пару ссылок (&#8220;Профиль&#8221; и &#8220;Выйти&#8221;). Попутно закинули инициализацию массива ссылок для меню правой части нашего шаблона (на самом деле элементы интерфейса могут зависеть от текущего контроллера/метода, но это уже оффтоп). Для работы кода понадобятся представления.</p>
<p><em>application/views/header/logged.php</em><br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> OR <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct access allowed.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
Вы - &lt;strong&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$login</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/strong&gt;. &lt;a href='<span style="color: #000000; font-weight: bold;">&lt;?=</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>auth/profile'&gt;Профиль&lt;/a&gt;. &lt;a href='<span style="color: #000000; font-weight: bold;">&lt;?=</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>auth/logout'&gt;Выйти&lt;/a&gt;</pre></div></div>

<p></code></p>
<p><em>application/views/header/guest.php</em><br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> OR <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct access allowed.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;a href='<span style="color: #000000; font-weight: bold;">&lt;?=</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>auth/login'&gt;Войти&lt;/a&gt;</pre></div></div>

<p></code></p>
<p>Не забываем, что теперь надо все используемые контроллеры наследовать не от <strong>Template_Controller</strong>, как раньше, а от <strong>Web_Controller</strong>. Ну и по-хорошему надо бы анализировать предыдущий URL, с которого пользователь выходил на страницы с <strong>login</strong>/<strong>logout</strong>, чтобы перенаправлять его обратно.</p>
<p>Далее еще немного подумаем. Если пользователь залогинен, то ему бессмысленно попадать на страницу авторизации, поэтому добавим в самое начало метода <strong>login()</strong> такую строчку:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span> AND url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/profile'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Редирект произойдет только если переменная <strong>$this->user</strong> содержит информацию о текущем пользователе. Добавим такую же проверку в метод <strong>register()</strong>, а также по аналогии изменим <strong>logout()</strong>:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span> OR url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<h2>Заполняем анкету</h2>
<p>Конечно, страница профиля смотрится бедненько, точнее совсем не смотрится. Предлагаю дать возможность пользователю ввести дополнительную информацию о себе (ФИО, телефон и т.д.). Для этого надо создать отдельную таблицу <strong>user_details</strong>. Почему я не хочу расширить существующую таблицу <strong>users</strong>? Дело в том, что анкетные данные &#8211; информация скорее справочная, и так часто использоваться не будет. А вот из users данные будут браться чаще (как минимум при <strong>login</strong>/<strong>logout</strong>), да и хранить в сессии лишние данные (ведь у нас там <strong>User_Model</strong>) как-то неохота. Поэтому решено &#8211; создаем отдельную таблицу:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`user_details`</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span>  <span style="color: #ff0000;">`user_details`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`user_id`</span> int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`first_name`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`last_name`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`middle_name`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`interests`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`about`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`icq`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`jabber`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`website`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`city`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">127</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`user_id`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
  CONSTRAINT <span style="color: #ff0000;">`FK_user_details_1`</span> <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`user_id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">`users`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> CASCADE
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8;</pre></div></div>

<p></code></p>
<p>Создали несколько полей, связали с таблицей `<strong>users</strong>` внешним ключом (т.к. связь один-к-одному, то <strong>user_id</strong> является и первичным ключом). Все поля, кроме u<strong>ser_id</strong>, являются необязательными.</p>
<p>Какой следующий этап? Вспоминаем, какие компоненты MVC используются для предоставления данных из БД &#8211; правильно, модели. Надо создать модель (конечно, это будет ORM-модель), предоставляющую возможность работать с таблицей <strong>user_details</strong>. Все это несложно:</p>
<p>файл <em>application/models/User_Detail.php</em><br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> OR <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct access allowed.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> User_Detail_Model <span style="color: #000000; font-weight: bold;">extends</span> ORM <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Relationships</span>
    protected <span style="color: #000088;">$has_one</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    protected <span style="color: #000088;">$primary_key</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'user_id'</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #009933; font-style: italic;">/**
	 * Validates and optionally saves a new user record from an array.
	 *
	 * @param  array    values to check
	 * @param  boolean  save the record when validation succeeds
	 * @return boolean
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> validate<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #000088;">$save</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> Validation<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">-&gt;</span><span style="color: #004000;">pre_filter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trim'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_massive_rules</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'first_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'last_name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'middle_name'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'length[2,127]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chars[\pL -\']'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_massive_rules</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'interests'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'city'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[2,127]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'standard_text'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'website'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[2,127]'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'icq'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[2,10]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chars[\pN-]'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'about'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[2,255]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'standard_text'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jabber'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[2,127]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #000088;">$save</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Разбираемся. В ORM-моделях необходимо описывать связи с другими таблицами в виде свойств (<strong>$has_one</strong>, <strong>$has_many</strong>, <strong>$belongs_to</strong>, <strong>$has_and_belongs_to_many</strong>), имена которых говорят сами за себя. Так как связь с таблицей users один-к-одному, то мы вписываем имя таблицы в свойство <strong>$has_one</strong>. Таким образом, информация о пользователе из данной таблицы будет доступно через &#8220;магическое&#8221; свойство <strong>users</strong> (например, <strong>$userdata->users</strong>). Идем дальше. Одно из стандартных требований ORM &#8211; первичные ключи должны иметь имя `id`. Но есть и обходной путь &#8211; свойство <strong>$primary_key</strong> позволяет нам задать другое имя для первичного ключа, чем мы и пользуемся.</p>
<p>Из методов необходимо только описать валидацию данных, т.к. в ней описываются требования к вводимым данным. Обратите внимание на использование нашего &#8220;напильникового&#8221; метода <strong>add_massive_rules</strong> (мы его создавали в <a href="http://brotkin.ru/2009/01/25/pravila-validacii-dlya-gruppy-polej/" title="Добавление правил сразу для группы полей">этой статье</a>). Также стоит пристальнее глянуть на правила вида &#8216;<strong>chars[\pL -\']</strong>&#8216; &#8211; о том, как я к ним пришел, можно почитать <a href="http://brotkin.ru/2009/01/28/validaciya-kirillicy/">здесь</a>.</p>
<p>Далее, надо создать метод контроллера для редактирования анкеты пользователя. Назовем его <strong>change_profiile()</strong>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> change_profile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span> OR url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$userdata</span> <span style="color: #339933;">=</span> ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_detail'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// введены данные формы</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'first_name'</span> <span style="color: #339933;">=&gt;</span>   <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'last_name'</span> <span style="color: #339933;">=&gt;</span>    <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'middle_name'</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'city'</span> <span style="color: #339933;">=&gt;</span>         <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'interests'</span> <span style="color: #339933;">=&gt;</span>    <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'about'</span> <span style="color: #339933;">=&gt;</span>        <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'website'</span> <span style="color: #339933;">=&gt;</span>      <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'icq'</span> <span style="color: #339933;">=&gt;</span>          <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'jabber'</span> <span style="color: #339933;">=&gt;</span>       <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> arr<span style="color: #339933;">::</span><span style="color: #004000;">overwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$userdata</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$userdata</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$userdata</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000088;">$errors</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Result'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Change_profile.Succesfull'</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">else</span> <span style="color: #000088;">$errors</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Result'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Change_profile.Error'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth/edit_profile'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ваша анкета'</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">userdata</span> <span style="color: #339933;">=</span> arr<span style="color: #339933;">::</span><span style="color: #004000;">overwrite</span><span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">::</span><span style="color: #004000;">merge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">as_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$userdata</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">as_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$errors</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>В самом начале скрипта проверяем, вошел ли пользователь (т.к. у гостя профиля нет и редактировать ему нечего). Для заполнения массива <strong>$data</strong> только нужными нам значениями использовали функцию <strong>arr::overwrite()</strong>, которая позволила скопировать из <strong>$_POST</strong> только значения полей ,перечисленных в <strong>$data</strong>. Далее создается модель <strong>User_Detail</strong> через метод <strong>ORM::factory()</strong>. Для выборки данных передается первичный ключ &#8211; идентификатор текущего пользователя. В случае успешного прохождения валидации состояние модели <strong>$userdata</strong> сохраняется с помощью метода <strong>save()</strong>.</p>
<blockquote><p>
Обратите внимание, что поля, не участвующие в валидации, необходимо добавить в модель вручную! Так пришлось поступить с первичным ключом <strong>user_id</strong>.
</p></blockquote>
<p>Для вывода результата работы скрипта заполняются переменные шаблона <strong>content</strong>: <strong>$userdata</strong> (общая информация о пользователя, включая некорректно введенные в форму данные) и <strong>$errors</strong> (ошибки и сообщения валидации).</p>
<p>Ну и напоследок приведу текст шаблона:<br />
Файл <em>application/views/auth/edit_profile.php</em><br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;?php defined<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SYSPATH'</span><span style="color: #66cc66;">&#41;</span> OR die<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'No direct access allowed.'</span><span style="color: #66cc66;">&#41;</span>;?&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>Информация о пользователе <span style="color: #009900;">&lt;?<span style="color: #66cc66;">=</span>$userdata<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'username'</span><span style="color: #66cc66;">&#93;</span>?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=url::base(FALSE)?&gt;</span></span>auth/change_profile&quot; id=&quot;login&quot; method=&quot;post&quot;&gt;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;errors&quot;</span>&gt;&lt;?foreach<span style="color: #66cc66;">&#40;</span>$errors as $key<span style="color: #66cc66;">=</span>&gt;</span>$val):?&gt;<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;?<span style="color: #66cc66;">=</span>$key.<span style="color: #ff0000;">&quot;:&quot;</span>.$val?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;? endforeach?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>Личные данные<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;first_name&quot;</span>&gt;</span>Фамилия <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;first_name&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;first_name&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;127&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['first_name']?&gt;</span></span>&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;last_name&quot;</span>&gt;</span>Имя <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;last_name&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;last_name&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;127&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['last_name']?&gt;</span></span>&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;middle_name&quot;</span>&gt;</span>Отчество <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;middle_name&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;middle_name&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;127&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['middle_name']?&gt;</span></span>&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;city&quot;</span>&gt;</span>Город <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;city&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;city&quot;</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;127&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['city']?&gt;</span></span>&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>Контакты<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;website&quot;</span>&gt;</span>Сайт <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;website&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;website&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['website']?&gt;</span></span>&quot; size=&quot;20&quot; maxlength=&quot;127&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;icq&quot;</span>&gt;</span>ICQ <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;icq&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;icq&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['icq']?&gt;</span></span>&quot; size=&quot;20&quot; maxlength=&quot;10&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jabber&quot;</span>&gt;</span>Jabber <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jabber&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jabber&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['jabber']?&gt;</span></span>&quot; size=&quot;20&quot; maxlength=&quot;127&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>Дополнительно<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;interests&quot;</span>&gt;</span>Интересуюсь <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;interests&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;interests&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$userdata['interests']?&gt;</span></span>&quot; size=&quot;20&quot; maxlength=&quot;127&quot; /&gt;
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;about&quot;</span>&gt;</span>О себе <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">textarea</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;about&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;about&quot;</span> <span style="color: #000066;">rows</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;3&quot;</span> &gt;&lt;?<span style="color: #66cc66;">=</span>$userdata<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'about'</span><span style="color: #66cc66;">&#93;</span>?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">textarea</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Сохранить&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p></code></p>
<p>Думаю, стоит сделать небольшой перерыв, дабы все это проверить и осмыслить <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Update</strong>. Конечно, постоянно хранить в сессии весь <strong>ORM</strong>-объект совсем необязательно. В принципе, нам потребуется <strong>id</strong> и <strong>username</strong> (его мы показываем в &#8220;шапке&#8221;), а уже если в какой-то момент потребуется проверить уровень доступа, тогда на основании <strong>id</strong> конструировать модель и проверять наличие нужной роли через метод <strong>has()</strong>.</p>
<p><strong>Update2</strong>. Как правильно заметил Алексей (Alex_XS), теперь после регистрации пользователей можно их перенаправлять сразу на редактирование анкеты (т.е. <strong>url::redirect(&#8216;auth/change_profile&#8217;)</strong>).</p>
<p><strong>Update3</strong>. Выложил <a href="http://brotkin.ru/examples/kohana_tutorials/auth_archive.rar">архив</a> с классами по итогам двух уроков с модулем <strong>Auth</strong>. Обратите внимание, что мы переопределили процесс валидации пользователя (<em>models/auth_user.php</em>) и создали новый метод <strong>add_massive_rules</strong> для объекта <strong>Validation</strong> (файл <em>libraries/MY_Validation.php</em>).</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/01/29/auth_example2/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/01/29/auth_example2/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/01/29/auth_example2/&t=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/01/29/auth_example2/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/01/29/auth_example2/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/01/29/auth_example2/&u_data[name]=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/01/29/auth_example2/&title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/01/29/auth_example2/&bm_description=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/01/29/auth_example2/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Зарегистрируйтесь!</title>
		<link>http://brotkin.ru/2009/01/26/auth_example1/</link>
		<comments>http://brotkin.ru/2009/01/26/auth_example1/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 13:38:23 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[учебник]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=131</guid>
		<description><![CDATA[Добрый день!
Настало время рассказать об одной из главных задач, стоящих перед программистом при создании сайта. Необходимо предусмотреть механизм учета посетителей, включающий регистрацию, аутентификацию, модерирование информации о пользователях&#8230; естественно с помощью Kohana 
Как вы могли заметить, к дистрибутиву фреймворка прилагается (если вы конечно поставили галочку в нужном месте при загрузке Kohana) модуль Auth. В нем уже [...]]]></description>
			<content:encoded><![CDATA[<p>Добрый день!</p>
<p>Настало время рассказать об одной из главных задач, стоящих перед программистом при создании сайта. Необходимо предусмотреть механизм учета посетителей, включающий регистрацию, аутентификацию, модерирование информации о пользователях&#8230; естественно с помощью Kohana <span id="more-131"></span></p>
<p>Как вы могли заметить, к дистрибутиву фреймворка прилагается (если вы конечно поставили галочку в нужном месте при загрузке Kohana) модуль <strong>Auth</strong>. В нем уже реализованы базовые механизмы аутентификации и авторизации, нам останется только научиться их использовать. Итак, в путь.</p>
<h2>Первоначальная настройка</h2>
<p>Сам модуль располагается в <em>modules/auth</em>. Сперва необходимо скопировать файл <em>modules/auth/config/auth.php</em> в папку <em>application/config/</em> (думаю, понятно зачем). Внутри находятся настройки модуля, из которых мы выделим следующие:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'driver'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'ORM'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'hash_method'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'sha1'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'salt_pattern'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'1, 3, 5, 9, 14, 15, 20, 21, 28, 30'</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Сперва указывается используемый драйвер (в поставке есть выбор между ORM и файловым). Насколько я смог понять из исходников, при выборе файлового драйвера пользователи просто хранятся в массиве <strong>$config['users']</strong> в виде сочетания <em>ИМЯ=>ХЭШ_ПАРОЛЯ</em>. Поэтому мы будем использовать всю мощь связки ORM+БД.</p>
<p>Алгоритмы хэширования, которые мы можем использовать, возвращает php-функция <strong>hash_algos()</strong>. Как видите, по умолчанию используется <a href="http://www.faqs.org/rfcs/rfc3174" title="US Secure Hash Algorithm 1">sha1</a>. Честно говоря, не вижу смысла менять его на какой-либо другой, если вы не параноик (либо знаете, что делаете).</p>
<p>Ну, и напоследок &#8211; соль. Простое получение хэша от введенного пароля не является безопасным способом, поэтому используют дополнительные куски текста для формирования более стойких хэшей. Суть в том, что перед указанными нами позициями (по умолчанию до первой, третьей и т.д. &#8211; и не забываем, что смещение в строке отсчитывается с нуля) вставляются символы, &#8220;разбавляющие&#8221; хэш самого пароля. В итоге, не зная конкретного расположения &#8220;крупинок соли&#8221;, тяжело вломать хэш. Лучше изменить настройку <strong>salt_pattern</strong> по умолчанию, но не забывайте, что это надо делать <strong>до</strong> регистрации пользователей, т.к. меняется алгоритм расчета хэшей. Также помним, что стандартно функция <strong>hash()</strong> возвращает 40-символьную строку, поэтому указывать смещения 40 и более бессмысленно.</p>
<h2>Создаем таблицы в БД</h2>
<p>Модуль <strong>Auth</strong> с драйвером ORM потребует от нас создания нескольких таблиц. К сожалению, в Kohana версии 2.3.1 уже не поставляется демо-контроллер <strong>Auth_Demo</strong>, в котором, в частности, был приведен текст SQL-запросов для этих самых таблиц. Приведу текст запросов из версии 2.3:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">IF <span style="color: #CC0099; font-weight: bold;">NOT</span> EXISTS</span> <span style="color: #008000;">`roles`</span> <span style="color: #FF00FF;">&#40;</span>
  <span style="color: #008000;">`id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">11</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #FF9900; font-weight: bold;">auto_increment</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`name`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">32</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`description`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">255</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span>  <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
  <span style="color: #FF9900; font-weight: bold;">UNIQUE</span> <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`uniq<span style="color: #008080; font-weight: bold;">_</span>name`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`name`</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span><span style="color: #990099; font-weight: bold;">InnoDB</span>  <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> <span style="color: #008000;">`roles`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #000033;">,</span> <span style="color: #008000;">`name`</span><span style="color: #000033;">,</span> <span style="color: #008000;">`description`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">VALUES</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">1</span><span style="color: #000033;">,</span> <span style="color: #008000;">'login'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'Login privileges, granted after account confirmation'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
<span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> <span style="color: #008000;">`roles`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #000033;">,</span> <span style="color: #008000;">`name`</span><span style="color: #000033;">,</span> <span style="color: #008000;">`description`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">VALUES</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">2</span><span style="color: #000033;">,</span> <span style="color: #008000;">'admin'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'Administrative user, has access to everything.'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">IF <span style="color: #CC0099; font-weight: bold;">NOT</span> EXISTS</span> <span style="color: #008000;">`roles<span style="color: #008080; font-weight: bold;">_</span>users`</span> <span style="color: #FF00FF;">&#40;</span>
  <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`role<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span>  <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #000033;">,</span><span style="color: #008000;">`role<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`fk<span style="color: #008080; font-weight: bold;">_</span>role<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`role<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span><span style="color: #990099; font-weight: bold;">InnoDB</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">IF <span style="color: #CC0099; font-weight: bold;">NOT</span> EXISTS</span> <span style="color: #008000;">`users`</span> <span style="color: #FF00FF;">&#40;</span>
  <span style="color: #008000;">`id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">11</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #FF9900; font-weight: bold;">auto_increment</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`email`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">127</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`username`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">32</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #008000;">''</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`password`</span> <span style="color: #000099;">char</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">50</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`logins`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #990099; font-weight: bold;">default</span> <span style="color: #008000;">'0'</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`last<span style="color: #008080; font-weight: bold;">_</span>login`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span>  <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
  <span style="color: #FF9900; font-weight: bold;">UNIQUE</span> <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`uniq<span style="color: #008080; font-weight: bold;">_</span>username`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`username`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
  <span style="color: #FF9900; font-weight: bold;">UNIQUE</span> <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`uniq<span style="color: #008080; font-weight: bold;">_</span>email`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`email`</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span><span style="color: #990099; font-weight: bold;">InnoDB</span>  <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">IF <span style="color: #CC0099; font-weight: bold;">NOT</span> EXISTS</span> <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>tokens`</span> <span style="color: #FF00FF;">&#40;</span>
  <span style="color: #008000;">`id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">11</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #FF9900; font-weight: bold;">auto_increment</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">11</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>agent`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">40</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`token`</span> <span style="color: #999900; font-weight: bold;">varchar</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">32</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`created`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #008000;">`expires`</span> <span style="color: #999900; font-weight: bold;">int</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">unsigned</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span>  <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
  <span style="color: #FF9900; font-weight: bold;">UNIQUE</span> <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`uniq<span style="color: #008080; font-weight: bold;">_</span>token`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`token`</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">KEY</span> <span style="color: #008000;">`fk<span style="color: #008080; font-weight: bold;">_</span>user<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span><span style="color: #CC0099;">=</span><span style="color: #990099; font-weight: bold;">InnoDB</span>  <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #FF9900; font-weight: bold;">CHARSET</span><span style="color: #CC0099;">=</span>utf8<span style="color: #000033;">;</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">ALTER</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #008000;">`roles<span style="color: #008080; font-weight: bold;">_</span>users`</span>
  <span style="color: #990099; font-weight: bold;">ADD</span> <span style="color: #990099; font-weight: bold;">CONSTRAINT</span> <span style="color: #008000;">`roles<span style="color: #008080; font-weight: bold;">_</span>users<span style="color: #008080; font-weight: bold;">_</span>ibfk<span style="color: #008080; font-weight: bold;">_</span>1`</span> <span style="color: #990099; font-weight: bold;">FOREIGN KEY</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">REFERENCES</span> <span style="color: #008000;">`users`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ON</span> <span style="color: #990099; font-weight: bold;">DELETE</span> <span style="color: #990099; font-weight: bold;">CASCADE</span><span style="color: #000033;">,</span>
  <span style="color: #990099; font-weight: bold;">ADD</span> <span style="color: #990099; font-weight: bold;">CONSTRAINT</span> <span style="color: #008000;">`roles<span style="color: #008080; font-weight: bold;">_</span>users<span style="color: #008080; font-weight: bold;">_</span>ibfk<span style="color: #008080; font-weight: bold;">_</span>2`</span> <span style="color: #990099; font-weight: bold;">FOREIGN KEY</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`role<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">REFERENCES</span> <span style="color: #008000;">`roles`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ON</span> <span style="color: #990099; font-weight: bold;">DELETE</span> <span style="color: #990099; font-weight: bold;">CASCADE</span><span style="color: #000033;">;</span>
&nbsp;
<span style="color: #990099; font-weight: bold;">ALTER</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>tokens`</span>
  <span style="color: #990099; font-weight: bold;">ADD</span> <span style="color: #990099; font-weight: bold;">CONSTRAINT</span> <span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>tokens<span style="color: #008080; font-weight: bold;">_</span>ibfk<span style="color: #008080; font-weight: bold;">_</span>1`</span> <span style="color: #990099; font-weight: bold;">FOREIGN KEY</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`user<span style="color: #008080; font-weight: bold;">_</span>id`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">REFERENCES</span> <span style="color: #008000;">`users`</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`id`</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ON</span> <span style="color: #990099; font-weight: bold;">DELETE</span> <span style="color: #990099; font-weight: bold;">CASCADE</span><span style="color: #000033;">;</span></pre></div></div>

<p></code></p>
<p>Для наделения пользователей определенными правами будут использоваться роли. Сразу создаются две стандартные роли &#8211; <strong>login</strong> (собственно эта роль дает право входить на сайт под этим логином) и <strong>admin</strong> (тут все понятно). Обратите внимание на имена таблиц и полей, в частности внешних ключей &#8211; это одно из требований ORM Kohana (в ближайшем будущем планирую написать статью об этом чуде).</p>
<h2>Пробуем зарегистрироваться</h2>
<p>Итак, сперва было яйцо&#8230; Или курица&#8230; В общем, в начале должно быть что-то, от чего нам отталкиваться, и это конечно регистрация пользователя. Давайте накидаем код:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> OR <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct access allowed.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Auth_Controller <span style="color: #000000; font-weight: bold;">extends</span> Template_Controller <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$template</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">menus</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
    <span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'main'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
      <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'title'</span>   <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">'Главная страница блога'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'link'</span>    <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">'/blog/'</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
      <span style="color: #0000ff;">'article'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
      <span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'title'</span>   <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">'Статья &quot;Наша первая страница на Kohana&quot;'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'link'</span>    <span style="color: #339933;">=&gt;</span>  <span style="color: #0000ff;">'/2009/01/12/'</span><span style="color: #339933;">,</span>
      <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">login</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> index<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/register'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> register<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Регистрация нового пользователя'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> View<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth/register'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// введены данные формы</span>
        <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'email'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'email_confirm'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'password_confirm'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> arr<span style="color: #339933;">::</span><span style="color: #004000;">overwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
          <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'role'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/profile'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000088;">$errors</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'register'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ошибка создания пользователя'</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$errors</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">postdata</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_object</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">as_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$data</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> profile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Профиль пользователя'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Пользователь зарегистрирован!'</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>В конструкторе мы заполняем парочку переменных для шаблона <strong>index</strong> (вспоминаем <a href="http://brotkin.ru/2009/01/13/nasha-pervaya-stranica-na-kohana/">первую страницу на Kohana</a>). На будущее создаем еще переменную <strong>login</strong> в шаблоне &#8211; мы же захотим, чтобы имя залогиненного пользователя было видно на странице. По умолчанию мы перенаправим пользователя сразу на страницу регистрации (конечно это неправильно, но у нас пока будет так). Обратите внимание на <strong>url::base(FALSE)</strong> &#8211; мы считываем путь к корню сайта, т.к. не всегда сайт располагается в корне.</p>
<p>Самое интересное хранится в методе <strong>register</strong>. Условие <strong>if ($this->input->post())</strong> проверяет наличие данных в глобальном массиве <strong>$_POST</strong> (наша форма регистрации будет передавать их именно через него, привыкайте к правилу &#8220;данные меняются только через POST&#8221;). Далее мы инициализируем массивы для хранения ошибок (<strong>$errors</strong>) и самих данных (<strong>$data</strong>). Зачем делать именно так, мы видим уже на следующей строке:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
          <span style="color: #0000ff;">'email'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'email_confirm'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
          <span style="color: #0000ff;">'password_confirm'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> arr<span style="color: #339933;">::</span><span style="color: #004000;">overwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Если посмотреть в документацию, узнаем, что <strong>arr::overwrite()</strong> позволяет перезаписать данные из второго параметра в первый, но только по существующим в первом массиве ключам. Т.е. если бы массив <strong>$data</strong> был пустым, ничего в него бы не записалось. Аналогично с массивом <strong>$errors</strong>, но его мы заполним позже. Почему именно эти поля? Вспомним заметку в &#8220;Напильнике&#8221; о <a href="http://brotkin.ru/2009/01/23/dostaem-napilnik/" title="Статья об изменении модели Auth_User">доработке объекта Auth_User</a>. Там разбирались правила, назначаемые полям, вводимым пользователем. Соответственно и ошибки могут быть связаны только с этими полями.</p>
<p>Следующий кусок:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
   <span style="color: #000088;">$errors</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'role'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
      url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>url<span style="color: #339933;">::</span><span style="color: #004000;">base</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'auth/profile'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">else</span> <span style="color: #000088;">$errors</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'register'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Ошибка создания пользователя'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Здесь мы создаем экземпляр модели <strong>User</strong> (если посмотрите исходники, то увидите, что это расширение модели <strong>Auth_User</strong>) и проверяем его на валидность, передавая в качестве входных данных массив <strong>$data</strong>. Если валидация успешна, дополняем данные пользователя ролями (точнее одной ролью &#8216;login&#8217;, она необходима для успешных логинов) и сохраняем в БД. Если произошла ошибка валидации, в массив <strong>$errors</strong> сохраняем ошибки (они доступны через метод <strong>errors()</strong>, ну да вы помните). На всякий случай проверяем, сохранилась ли запись в БД, чтобы выдать соответствующую ошибку.</p>
<p>Как вы наверняка заметили, при успешном выполнении сценария идет редирект на метод <strong>profile()</strong>, в нем мы позже сделаем просмотр подробных данных, но сейчас достаточно и строки об успехе нашего предприятия. Если же произошла ошибка, необходимо не только отобразить ошибки, но и заполнить поля формы ранее введенными пользователем данными (кроме паролей конечно). Для этого используем переменную шаблона <strong>$postdata</strong> и метод <strong>as_array()</strong>.</p>
<h2>Чего-то не хватает&#8230;</h2>
<p>Конечно, сразу у вас ничего хорошего не запустится, т.к. не созданы шаблоны. Итак, исходники в студию!</p>
<p>Файл <em>application/views/auth/register.php</em>:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;?php defined<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SYSPATH'</span><span style="color: #66cc66;">&#41;</span> OR die<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'No direct access allowed.'</span><span style="color: #66cc66;">&#41;</span>; ?&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'&lt;?=url::base(FALSE)?&gt;</span></span>auth/register' id='login' method='post'&gt;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>Регистрация пользователя<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'errors'</span>&gt;&lt;?foreach<span style="color: #66cc66;">&#40;</span>$errors as $key<span style="color: #66cc66;">=</span>&gt;</span>$val):?&gt;<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;?<span style="color: #66cc66;">=</span>$key.<span style="color: #ff0000;">&quot;:&quot;</span>.$val?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;&lt;? endforeach?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'email'</span>&gt;</span>e-mail <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">em</span>&gt;</span>*<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">em</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'text'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'email'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'email'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;32&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=isset($postdata['email']) ? $postdata['email'] : ''?&gt;</span></span>&quot; /&gt;<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'email'</span>&gt;</span>Повторите e-mail <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">em</span>&gt;</span>*<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">em</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'text'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'email_confirm'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'email_confirm'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;32&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=isset($postdata['email_confirm']) ? $postdata['email_confirm'] : ''?&gt;</span></span>&quot; /&gt;<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'username'</span>&gt;</span>Логин <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">em</span>&gt;</span>*<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">em</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'text'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'username'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'username'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;32&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=isset($postdata['username']) ? $postdata['username'] : ''?&gt;</span></span>&quot; /&gt;<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span>&gt;</span>Пароль <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">em</span>&gt;</span>*<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">em</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;50&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">for</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span>&gt;</span>Повторите пароль <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">em</span>&gt;</span>*<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">em</span>&gt;</span> <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password'</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password_confirm'</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'password_confirm'</span> <span style="color: #000066;">size</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;30&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;50&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Зарегистрироваться&quot;</span> <span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ol</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p></code></p>
<p>Файл <em>application/views/index.php</em> (он слегка изменился с прошлого раз):<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;&lt;?<span style="color: #66cc66;">=</span>$title?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=url::base(FALSE)?&gt;</span></span>css/index.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'wrapper'</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'header'</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>Наш блог<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'loginboard'</span>&gt;&lt;?<span style="color: #66cc66;">=</span>$login?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'page'</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'content'</span>&gt;</span>
      <span style="color: #009900;">&lt;?<span style="color: #66cc66;">=</span>$content?&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'sidebar'</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'menu'</span>&gt;</span>
            <span style="color: #009900;">&lt;?foreach <span style="color: #66cc66;">&#40;</span>$menus as $menu<span style="color: #66cc66;">&#41;</span>: ?&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?=$menu['link']?&gt;</span></span>&quot;&gt;<span style="color: #009900;">&lt;?<span style="color: #66cc66;">=</span>$menu<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'title'</span><span style="color: #66cc66;">&#93;</span>?&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span>
            <span style="color: #009900;">&lt;?endforeach;?&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'footer'</span>&gt;</span>
Made in Russia, 2009
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p></code></p>
<p>Ну и чтобы форма регистрации смотрелась веселее, добавим немного стилей в <em>css/index.php</em>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">form<span style="color: #cc00cc;">#login</span> fieldset <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">margin-bottom</span><span style="color: #00AA00;">:</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
form<span style="color: #cc00cc;">#login</span> legend <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">2px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
form<span style="color: #cc00cc;">#login</span> label <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> inline-<span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1.1em</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">200px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #cc00cc;">#A52A2A</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
form<span style="color: #cc00cc;">#login</span> label em <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
form<span style="color: #cc00cc;">#login</span> ol <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
form<span style="color: #cc00cc;">#login</span> li <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">list-style</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">border-bottom</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #993333;">silver</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p></code></p>
<p>Теперь можно открыть <em>http://localhost/auth/</em> и полюбоваться на форму регистрации. Хотя зачем любоваться, возьмем да зарегистрируемся!</p>
<h2>PS. Прощаться не будем</h2>
<p>Конечно, даже если все у вас получилось с первого раза, сам по себе результат не очевиден &#8211; в факте создания нового пользователя мы можем убедиться только вручную сделав выборку из БД. Поэтому-то я очень скоро напишу вторую часть статьи, в которой мы научимся входить на сайт, выходить и &#8220;не терять себя&#8221; при переходе с одной страницы на другую. До скорой встречи!</p>
<h2>Update</h2>
<p>Обратите внимание, что после редактирования шаблона <strong>index.php</strong> в нем появилась переменная <strong>$login</strong>, которую мы в конструкторе инициализировали, но ничего конкретного не присваивали. Это как бы шаг в будущее (читайте <a href="http://brotkin.ru/2009/01/29/auth_example2/" title="статья 'Представьтесь!'">вторую</a> статью), там мы будем хранить блог авторизации (или приветственное сообщение для авторизованного пользователя).</p>
<p>А вот если вы запустите созданный нами ранее контроллер <strong>Blog_Controller</strong> (или даже просто страницу по умолчанию <em>http://localhost</em>, если вы перенастроили <strong>routing</strong> на этот контроллер), то увидите отладочной сообщение об отсутствующей переменной <strong>$login</strong> в шаблоне. Самый простой выход &#8211; создать эту переменную в конструкторе этого контроллера, а лучше &#8211; переходите-ка вы ко <a href="http://brotkin.ru/2009/01/29/auth_example2/">второй части</a>. <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/01/26/auth_example1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/01/26/auth_example1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/01/26/auth_example1/&t=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/01/26/auth_example1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/01/26/auth_example1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/01/26/auth_example1/&u_data[name]=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/01/26/auth_example1/&title=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/01/26/auth_example1/&bm_description=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D1%83%D0%B9%D1%82%D0%B5%D1%81%D1%8C%21+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/01/26/auth_example1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Достаем напильник: Auth_User-&gt;validation</title>
		<link>http://brotkin.ru/2009/01/23/dostaem-napilnik/</link>
		<comments>http://brotkin.ru/2009/01/23/dostaem-napilnik/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 11:25:41 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[напильник]]></category>
		<category><![CDATA[auth]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=81</guid>
		<description><![CDATA[Ранее я уже упоминал о переопределении одной из библиотек с целью избавления от index.php в URL при использовании url::redirect(). Сегодня, подготавливая проект для статьи о модуле Auth (да-да, на очереди аутентификация), столкнулся с небольшой проблемой.
Проблема
Не буду сильно вдаваться в подробности (они будут описаны в статье), просто скажу, что в модуле Auth поставляется модель Auth_User,  [...]]]></description>
			<content:encoded><![CDATA[<p>Ранее я уже <a href="http://brotkin.ru/2009/01/13/nasha-pervaya-stranica-na-kohana/" title="Статья 'Наша первая страница на Kohana'">упоминал</a> о переопределении одной из библиотек с целью избавления от <em>index.php</em> в URL при использовании <strong>url::redirect()</strong>. Сегодня, подготавливая проект для статьи о модуле <strong>Auth</strong> (да-да, на очереди аутентификация), столкнулся с небольшой проблемой.</p>
<h2>Проблема</h2>
<p>Не буду сильно вдаваться в подробности (они будут описаны в статье), просто скажу, что в модуле <strong>Auth</strong> поставляется модель <strong>Auth_User</strong>,  у которой присутствует метод <strong>validate()</strong>. Он выполняет проверку введенных данных на соответствие следующим правилам (они описаны в теле модели и извне их не изменить):</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #009933; font-style: italic;">/**
	 * Validates and optionally saves a new user record from an array.
	 *
	 * @param  array    values to check
	 * @param  boolean  save the record when validation succeeds
	 * @return boolean
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> validate<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #339933;">&amp;</span> <span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #000088;">$save</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$array</span> <span style="color: #339933;">=</span> Validation<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">pre_filter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trim'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[4,127]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'valid::email'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[4,32]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chars[a-zA-Z0-9_.]'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'username_exists'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[5,42]'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password_confirm'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'matches[password]'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Если вы читали статью в справочнике об объекте <strong>Validation</strong> (нет?! так <a href="http://brotkin.ru/2009/01/23/validation/" title="Статья о валидации данных в Справочнике">прочтите</a> <img src='http://brotkin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), то все должно быть понятно. Сперва данные фильтруются (функция <strong>trim()</strong> удаляет пробелы слева и справа в строке), далее добавляются правила:</p>
<ul>
<li>Адрес электронной почты должен присутствовать (<strong>required</strong>), быть от 4 до 127 символов длиной (<strong>length[4,127]</strong>), ну и быть собственно корректным электронным адресом (<strong>valid::email</strong>)</li>
<li>Имя пользователя должно присутствовать, длина 4-32 символа, состоять из латинских букв, цифр, знака подчеркивания и точки (<strong>chars[a-zA-Z0-9_.]</strong>), плюс дополнительная проверка методом <strong>username_exists</strong> модели <strong>Auth_User</strong>. </li>
<li>Пароль должен присутствовать, длина от 5 до 42 символов.</li>
<li>Подтверждение пароля должно соответствовать паролю (естественно, нет смысла делать проверку длины и т.д.)</li>
</ul>
<p>И если проблем со стандартными правилами нет, то <strong>username_exists</strong> ведет себя странно &#8211; существующие логины пропускает, а незанятые не дает зарегистрировать. Смотрим исходники:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #009933; font-style: italic;">/**
	 * Tests if a username exists in the database. This can be used as a
	 * Valdidation rule.
	 *
	 * @param   mixed    id to check
	 * @return  boolean
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> username_exists<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>bool<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span>
			<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unique_key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">-&gt;</span><span style="color: #004000;">count_records</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">table_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Ошибку видите? Считаю до десяти и даю подсказку &#8211; какой будет результат, если количество записей (<strong>count_records()</strong>) будет равно нулю? Вот и я о том же. В итоге пришлось немного порыскать на форуме Kohana и выяснилось, что проблема известна, и в будущих версиях (2.4 и 2.3.2) она будет исправлена. Сейчас же остается только вручную вносить изменения, чем и займемся.</p>
<h2>Лекарство</h2>
<p>Единственный видимый мне способ (кроме правки непосредственно исходного файла) &#8211; копирование скрипта <strong>Auth_User.php</strong> в <em>application/models</em> и уже там править под себя. Т.е. мы будем использовать преимущества каскадной файловой системы (сперва класс смотрится в <em>application</em>, и только потом в <em>modules</em>). Вот какие мы внесем поправки:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// файл application/models/Auth_User.php</span>
<span style="color: #666666; font-style: italic;">// Строка 35. Вместо</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[4,32]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chars[a-zA-Z0-9_.]'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'username_exists'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #666666; font-style: italic;">// пишем</span>
     <span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_rules</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'required'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'length[4,32]'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'chars[a-zA-Z0-9_.]'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'username_available'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Строка 124. Заменяем метод username_exists на свой метод username_available:</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> username_available<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span>
			<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unique_key</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">-&gt;</span><span style="color: #004000;">count_records</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">table_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Сохраняем, проверяем. Теперь все тип-топ.</p>
<h2>Постскриптум</h2>
<p>Подобные сырости встречаются, поэтому я и решил создать для них отдельную рубрику &#8220;Напильник&#8221;. До встречи!</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/01/23/dostaem-napilnik/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/01/23/dostaem-napilnik/&t=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/01/23/dostaem-napilnik/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/01/23/dostaem-napilnik/&u_data[name]=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&title=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/01/23/dostaem-napilnik/&bm_description=%D0%94%D0%BE%D1%81%D1%82%D0%B0%D0%B5%D0%BC+%D0%BD%D0%B0%D0%BF%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%3A+Auth_User-%26gt%3Bvalidation+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/01/23/dostaem-napilnik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

