<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>CakePHP - Manual11/SimpleUserAuth</title>
<link>http://cake-php.ru/wiki/Manual11/SimpleUserAuth</link>
<description>History/revisions of CakePHP/Manual11/SimpleUserAuth</description>
<language>en-us</language>
<item>
<title>2008-02-01 16:30:54</title>
<link>http://cake-php.ru/wiki/Manual11/SimpleUserAuth/show?time=2008-02-01+16%3A30%3A54</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a name=".manual11.simpleuserauth" href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Simple&amp;nbsp;User&amp;nbsp;Auth&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-02-01+16%3A30%3A54">2008-02-01 16:30:54&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth">2009-02-05 22:58:45&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Что&amp;nbsp;ж, на&amp;nbsp;данный момент мы&amp;nbsp;установили, что&amp;nbsp;система аутентификации пользователей изменяется от&amp;nbsp;приложения к&amp;nbsp;приложению. Некоторые любят хешированные пароли, другие &amp;ndash; LDAP (Облегченный протокол доступа к&amp;nbsp;каталогам), и&amp;nbsp;почти все&amp;nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&amp;nbsp;оставляем это&amp;nbsp;на&amp;nbsp;вас. Изменится ли&amp;nbsp;это? Мы&amp;nbsp;не уверены пока. Сейчас, мы&amp;nbsp;думаем, что&amp;nbsp;большие накладные расходы при&amp;nbsp;встраивании этого в&amp;nbsp;фреймворк того не&amp;nbsp;стоят, потому что&amp;nbsp;создание собственной системы аутентификации пользователей с&amp;nbsp;Cake достаточно просто.&lt;br />
В&amp;nbsp;этом примере, мы&amp;nbsp;создадим простую систему аутентификации пользователей для&amp;nbsp;системы управления клиентами. Это&amp;nbsp;вымышленное приложение скорее всего будет использоваться в&amp;nbsp;офисе, чтобы следить за&amp;nbsp;контактной информацией и&amp;nbsp;соответственными заметками клиентов. Вся&amp;nbsp;функциональность системы будет размещена за&amp;nbsp;нашей системой аутентификации пользователей, кроме нескольких отображений, которые будут показывать только имена и&amp;nbsp;титулы клиентов, сохраненные в&amp;nbsp;системе.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Что&amp;nbsp;ж, на&amp;nbsp;данный момент мы&amp;nbsp;установили, что&amp;nbsp;система аутентификации пользователей изменяется от&amp;nbsp;приложения к&amp;nbsp;приложению. Некоторые любят хешированные пароли, другие &amp;ndash; LDAP (Облегченный протокол доступа к&amp;nbsp;кталогам), и&amp;nbsp;почти все&amp;nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&amp;nbsp;оставляем это&amp;nbsp;на&amp;nbsp;вас. Изменится ли&amp;nbsp;это? Мы&amp;nbsp;не уверены пока. Сейчас, мы&amp;nbsp;думаем, что&amp;nbsp;большие накладные расходы при&amp;nbsp;встраивании этого в&amp;nbsp;фреймворк того не&amp;nbsp;стоят, потому что&amp;nbsp;создание собственной системы аутентификации пользователей с&amp;nbsp;Cake достаточно просто.&lt;br />
В&amp;nbsp;этом примере, мы&amp;nbsp;создадим простую систему аутентификации пользователей для&amp;nbsp;системы управления клиентами. Это&amp;nbsp;вымышленное приложение скорее всего будет использоваться в&amp;nbsp;офисе, чтобы следить за&amp;nbsp;контактной информацией и&amp;nbsp;соответсвенными заметками клиентов. Вся&amp;nbsp;функциональность системы будет размещена за&amp;nbsp;нашей системой аутентификации пользователей, кроме нескольких отображений, которые будут показывать только имена и&amp;nbsp;титулы клиентов, сохраненные в&amp;nbsp;системе.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-02-01 15:49:33</title>
<link>http://cake-php.ru/wiki/Manual11/SimpleUserAuth/show?time=2008-02-01+15%3A49%3A33</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Simple&amp;nbsp;User&amp;nbsp;Auth&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-02-01+15%3A49%3A33">2008-02-01 15:49:33&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-02-01+16%3A30%3A54">2008-02-01 16:30:54&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;!--notypo-->&lt;fieldset class="table_of_contents">&lt;legend>&lt;strong> Оглавление документа   &lt;/strong>&lt;/legend>&lt;div class="toc1">&lt;a href="#h42-2">Общая картина&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-3">Аутентификация и&amp;nbsp;стойкость&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-4">Проверка доступа в&amp;nbsp;вашем приложении&lt;/a>&lt;/div>&lt;/fieldset>&lt;!--/notypo-->&lt;br />
Если вы&amp;nbsp;новичок в&amp;nbsp;CakePHP, вам&amp;nbsp;настоятельно рекомендуется копировать код&amp;nbsp;и&amp;nbsp;вставлять в&amp;nbsp;свое приложение для&amp;nbsp;использования. Если нет: эта&amp;nbsp;глава &amp;mdash; обсуждение ядра Cake, а&amp;nbsp;не безопасности приложений. Я&amp;nbsp;сомневаюсь, что&amp;nbsp;мы&amp;nbsp;будем обсуждать очевидные засады безопасности, главная цель этого примера &amp;ndash; показать как&amp;nbsp;работает ядро Cake, и&amp;nbsp;позволить вам&amp;nbsp;создавать пуленепробиваемые приложения.&lt;br />
В&amp;nbsp;Cake есть контроль доступа через встроенный движок ACL, но&amp;nbsp;как насчет аутентификации пользователей?&lt;br />
Что&amp;nbsp;ж, на&amp;nbsp;данный момент мы&amp;nbsp;установили, что&amp;nbsp;система аутентификации пользователей изменяется от&amp;nbsp;приложения к&amp;nbsp;приложению. Некоторые любят хешированные пароли, другие &amp;ndash; LDAP (Облегченный протокол доступа к&amp;nbsp;кталогам), и&amp;nbsp;почти все&amp;nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&amp;nbsp;оставляем это&amp;nbsp;на&amp;nbsp;вас. Изменится ли&amp;nbsp;это? Мы&amp;nbsp;не уверены пока. Сейчас, мы&amp;nbsp;думаем, что&amp;nbsp;большие накладные расходы при&amp;nbsp;встраивании этого в&amp;nbsp;фреймворк того не&amp;nbsp;стоят, потому что&amp;nbsp;создание собственной системы аутентификации пользователей с&amp;nbsp;Cake достаточно просто.&lt;br />
Вам&amp;nbsp;нужно всего три&amp;nbsp;вещи:&lt;br />
&lt;ol type="1">&lt;li> Способ аутентифицировать пользователей (обычно делается проверкой логина/пароля)
&lt;/li>&lt;li> Способ упорно следить что&amp;nbsp;пользователи путешествуют по&amp;nbsp;вашему приложению (обычно делается сессиями)
&lt;/li>&lt;li> Способ проверить аутентифицировался ли&amp;nbsp;пользователь (обычно устанавливается с&amp;nbsp;помощью взаимодействия с&amp;nbsp;сессиями)&lt;/li>&lt;/ol>
В&amp;nbsp;этом примере, мы&amp;nbsp;создадим простую систему аутентификации пользователей для&amp;nbsp;системы управления клиентами. Это&amp;nbsp;вымышленное приложение скорее всего будет использоваться в&amp;nbsp;офисе, чтобы следить за&amp;nbsp;контактной информацией и&amp;nbsp;соответсвенными заметками клиентов. Вся&amp;nbsp;функциональность системы будет размещена за&amp;nbsp;нашей системой аутентификации пользователей, кроме нескольких отображений, которые будут показывать только имена и&amp;nbsp;титулы клиентов, сохраненные в&amp;nbsp;системе.&lt;br />
Мы&amp;nbsp;начнем с&amp;nbsp;того, что&amp;nbsp;покажем вам&amp;nbsp;как проверить пользователей, которые пытаются получить доступ к&amp;nbsp;системе. Информация об&amp;nbsp;аутентифицированном пользователе будет храниться в&amp;nbsp;сессии PHP, используя компонент сессий. Когда у&amp;nbsp;нас есть информация пользователя в&amp;nbsp;сессии, мы&amp;nbsp;поместим проверки в&amp;nbsp;приложение, чтобы убедится, что&amp;nbsp;пользователь не&amp;nbsp;пытается добраться до&amp;nbsp;мест, куда ему&amp;nbsp;&amp;laquo;не нужно&amp;raquo; добираться.&lt;br />
На&amp;nbsp;заметку &amp;ndash; аутентификация это&amp;nbsp;не&amp;nbsp;то же&amp;nbsp;самое что&amp;nbsp;и&amp;nbsp;контроль доступа. Все&amp;nbsp;что нам&amp;nbsp;нужно в&amp;nbsp;этом примере это&amp;nbsp;являются ли&amp;nbsp;пользователи теми, кем&amp;nbsp;себя заявляют, и&amp;nbsp;дать им&amp;nbsp;основной доступ к&amp;nbsp;частям приложения. Мы&amp;nbsp;будем делать заметки где&amp;nbsp;можно разместить ACL, но&amp;nbsp;пока, давайте сфокусируемся на&amp;nbsp;простой аутентификации пользователей.&lt;br />
Я&amp;nbsp;также должен отметить, что&amp;nbsp;этот пример не&amp;nbsp;претендует на&amp;nbsp;звание какого-то букваря в&amp;nbsp;безопасности приложения. Мы&amp;nbsp;просто хотим дать вам&amp;nbsp;достаточно, чтобы вы&amp;nbsp;могли создать защищенные приложения самостоятельно.&lt;a name="h42-1">&lt;/a>&lt;h2>Аутентификация и&amp;nbsp;стойкость&lt;/h2>
Сначала нам&amp;nbsp;нужен способ хранить информацию о&amp;nbsp;пользователях, пытающихся получить доступ к&amp;nbsp;нашей системе управления клиентами. Система, которую мы&amp;nbsp;используем хранит информацию о&amp;nbsp;пользователях в&amp;nbsp;таблице базы данных, которая была создана согласно следующему SQL:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;font color=blue>Table&lt;/font>&amp;nbsp;'users',&amp;nbsp;Fictional&amp;nbsp;Client&amp;nbsp;Management&amp;nbsp;System&amp;nbsp;&lt;font color=blue>Database&lt;/font>&lt;br />
&lt;font color=blue>CREATE&lt;/font>&amp;nbsp;&lt;font color=blue>TABLE&lt;/font>&amp;nbsp;`users`&amp;nbsp;(&lt;br />
&amp;nbsp;&amp;nbsp;`id`&amp;nbsp;&lt;font color=blue>int&lt;/font>(&lt;font color=green>&lt;b>11&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>&amp;nbsp;auto_increment,&lt;br />
&amp;nbsp;&amp;nbsp;`username`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>255&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;`password`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>32&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;`first_name`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>255&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;`last_name`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>255&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;&lt;font color=blue>PRIMARY&lt;/font>&amp;nbsp;&lt;font color=blue>KEY&lt;/font>&amp;nbsp;&amp;nbsp;(`id`)&lt;br />
)&lt;font color=green>&lt;b>&lt;/b>&lt;/font>&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Достаточно просто, не&amp;nbsp;так ли? Модель Cake для&amp;nbsp;этой таблицы может быть достаточно ясной:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">User&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppModel&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$name&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;nbsp;&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">;&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Первое, что&amp;nbsp;нам нужно это&amp;nbsp;отображение и&amp;nbsp;действие логина. Это&amp;nbsp;даст возможность пользователям логиниться и&amp;nbsp;возможность системе обрабатывать информацию, чтобы узнать давать пользователю доступ или&amp;nbsp;нет. Отображение это&amp;nbsp;простая форма HTML, созданная при&amp;nbsp;помощи HTML Хелпера:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
/app/views/users/login.thtml&lt;br />&lt;span style="color: #0000BB">&amp;lt;?&lt;/span>&lt;span style="color: #007700">if&amp;nbsp;(&lt;/span>&lt;span style="color: #0000BB">$error&lt;/span>&lt;span style="color: #007700">):&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;p&amp;gt;The&amp;nbsp;login&amp;nbsp;credentials&amp;nbsp;you&amp;nbsp;supplied&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;recognized.&amp;nbsp;Please&amp;nbsp;try&amp;nbsp;again.&amp;lt;/p&amp;gt;&lt;br />&lt;span style="color: #0000BB">&amp;lt;?&amp;nbsp;&lt;/span>&lt;span style="color: #007700">endif;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;form&amp;nbsp;action="&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">url&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/users/login'&lt;/span>&lt;span style="color: #007700">);&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>"&amp;nbsp;method="post"&amp;gt;&lt;br />&amp;lt;div&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;label&amp;nbsp;for="username"&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">input&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User/username'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;array(&lt;/span>&lt;span style="color: #DD0000">'size'&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;gt;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">20&lt;/span>&lt;span style="color: #007700">));&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;/div&amp;gt;&lt;br />&amp;lt;div&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;label&amp;nbsp;for="password"&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">password&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User/password'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;array(&lt;/span>&lt;span style="color: #DD0000">'size'&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;gt;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">20&lt;/span>&lt;span style="color: #007700">));&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;/div&amp;gt;&lt;br />&amp;lt;div&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">submit&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'Login'&lt;/span>&lt;span style="color: #007700">);&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;/div&amp;gt;&lt;br />&amp;lt;/form&amp;gt;&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Это&amp;nbsp;отображение предоставляет простую форму логина для&amp;nbsp;пользователей пытающихся получить доступ к&amp;nbsp;системе. Действие для&amp;nbsp;формы это&amp;nbsp;/users/login, находится в&amp;nbsp;&lt;span class="missingpage">Users&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/UsersController/edit?add=1" title="Создать эту страницу">?&lt;/a> и&amp;nbsp;выглядит так:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
/app/controllers/users_controller.php&amp;nbsp;(частично)&lt;br />&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">UsersController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">login&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Не&amp;nbsp;показывать&amp;nbsp;сообщение&amp;nbsp;об&amp;nbsp;ошибке,&amp;nbsp;если&amp;nbsp;данные&amp;nbsp;не&amp;nbsp;были&amp;nbsp;отправлены.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">set&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'error'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">false&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Если&amp;nbsp;пользователь&amp;nbsp;отправил&amp;nbsp;данные&amp;nbsp;из&amp;nbsp;формы:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">if&amp;nbsp;(!empty(&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">data&lt;/span>&lt;span style="color: #007700">))&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Сначала&amp;nbsp;проверим,&amp;nbsp;есть&amp;nbsp;ли&amp;nbsp;пользователи&amp;nbsp;в&amp;nbsp;базе&amp;nbsp;данных&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//с&amp;nbsp;именем,&amp;nbsp;которое&amp;nbsp;предоставил&amp;nbsp;пользователь&amp;nbsp;в&amp;nbsp;форме:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$someone&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">User&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">findByUsername&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">data&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'username'&lt;/span>&lt;span style="color: #007700">]);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;На&amp;nbsp;этом&amp;nbsp;этапе&amp;nbsp;$someone&amp;nbsp;это&amp;nbsp;все&amp;nbsp;данные&amp;nbsp;пользователя,&amp;nbsp;или&amp;nbsp;же&amp;nbsp;она&amp;nbsp;пуста.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Давайте&amp;nbsp;сравним&amp;nbsp;пароль&amp;nbsp;из&amp;nbsp;формы&amp;nbsp;с&amp;nbsp;паролем&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//из&amp;nbsp;базы&amp;nbsp;данных.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">if(!empty(&lt;/span>&lt;span style="color: #0000BB">$someone&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'password'&lt;/span>&lt;span style="color: #007700">])&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$someone&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'password'&lt;/span>&lt;span style="color: #007700">]&amp;nbsp;==&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">data&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'password'&lt;/span>&lt;span style="color: #007700">])&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Заметка:&amp;nbsp;надеемся&amp;nbsp;что&amp;nbsp;пароли&amp;nbsp;в&amp;nbsp;вашей&amp;nbsp;БД&amp;nbsp;хешированы,&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;так&amp;nbsp;что&amp;nbsp;ваше&amp;nbsp;сравнение&amp;nbsp;может&amp;nbsp;выглядеть&amp;nbsp;так:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;md5($this-&amp;gt;data['User']['password'])&amp;nbsp;==&amp;nbsp;...&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Это&amp;nbsp;значит,&amp;nbsp;что&amp;nbsp;они&amp;nbsp;были&amp;nbsp;одинаковыми.&amp;nbsp;Теперь&amp;nbsp;мы&amp;nbsp;можем&amp;nbsp;создавать&amp;nbsp;некую&amp;nbsp;основную&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//информацию&amp;nbsp;сессии,&amp;nbsp;чтобы&amp;nbsp;запомнить&amp;nbsp;этого&amp;nbsp;пользователя&amp;nbsp;как&amp;nbsp;"залогиненого".&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Session&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">write&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$someone&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">]);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Теперь,&amp;nbsp;когда&amp;nbsp;у&amp;nbsp;нас&amp;nbsp;они&amp;nbsp;сохранены&amp;nbsp;в&amp;nbsp;сессии,&amp;nbsp;перенаправим&amp;nbsp;их&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//на&amp;nbsp;нужную&amp;nbsp;страницу&amp;nbsp;в&amp;nbsp;приложении.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">redirect&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/clients'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//В&amp;nbsp;другом&amp;nbsp;случае,&amp;nbsp;они&amp;nbsp;предоставили&amp;nbsp;не&amp;nbsp;верные&amp;nbsp;данные:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">else&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Помните&amp;nbsp;переменную&amp;nbsp;$error&amp;nbsp;в&amp;nbsp;отображении?&amp;nbsp;Давайте&amp;nbsp;поставим&amp;nbsp;ее&amp;nbsp;на&amp;nbsp;true:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">set&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'error'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">true&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">logout&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Перенаправляем&amp;nbsp;пользователя&amp;nbsp;на&amp;nbsp;это&amp;nbsp;действие,&amp;nbsp;если&amp;nbsp;они&amp;nbsp;нажали&amp;nbsp;кнопку&amp;nbsp;Выйти.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Все&amp;nbsp;что&amp;nbsp;нам&amp;nbsp;здесь&amp;nbsp;нужно,&amp;nbsp;это&amp;nbsp;удалить&amp;nbsp;информацию&amp;nbsp;сессии:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Session&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">delete&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Ну&amp;nbsp;и&amp;nbsp;наверняка&amp;nbsp;нам&amp;nbsp;нужно&amp;nbsp;перенаправить&amp;nbsp;их&amp;nbsp;куда-нибудь...&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">redirect&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Не&amp;nbsp;плохо: содержание действия login() может быть меньше 20 линий, если вы&amp;nbsp;были лаконичны. Результат этого действия либо 1: информация пользователя записана в&amp;nbsp;сессию и&amp;nbsp;он перенаправлен на&amp;nbsp;нужную страницу приложения, или&amp;nbsp;2: отброшен обратно на&amp;nbsp;страницу входа (в дополнении с&amp;nbsp;сообщением об&amp;nbsp;ошибке).&lt;a name="h42-2">&lt;/a>&lt;h2>Проверка доступа в&amp;nbsp;вашем приложении&lt;/h2>
Теперь мы&amp;nbsp;можем аутентифицировать пользователей, давайте сделаем так, что&amp;nbsp;приложение будет отбрасывать пользователей, пытающихся пробраться в&amp;nbsp;систему не&amp;nbsp;из формы логина или&amp;nbsp;&amp;laquo;основной&amp;raquo; директории клиентов.&lt;br />
Один способ это&amp;nbsp;создать функцию в&amp;nbsp;&lt;span class="missingpage">App&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/AppController/edit?add=1" title="Создать эту страницу">?&lt;/a>, которая будет делать проверку сессии и&amp;nbsp;отбрасывание.&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
/app/app_controller.php&lt;br />&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">Controller&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">checkSession&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Если&amp;nbsp;иформация&amp;nbsp;сессии&amp;nbsp;не&amp;nbsp;была&amp;nbsp;установлена...&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">if&amp;nbsp;(!&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Session&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">check&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">))&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Отправляет&amp;nbsp;пользователя&amp;nbsp;к&amp;nbsp;экрану&amp;nbsp;логина&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">redirect&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/users/login'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit();&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Теперь у&amp;nbsp;вас есть функция, которую вы&amp;nbsp;можете использовать в&amp;nbsp;любом контроллере, чтобы убедиться что&amp;nbsp;пользователи не&amp;nbsp;пытаются добраться до&amp;nbsp;действий контроллера, не&amp;nbsp;залогинившись до&amp;nbsp;этого. Когда она&amp;nbsp;на&amp;nbsp;месте вы&amp;nbsp;можете проверять доступ на&amp;nbsp;любом уровне &amp;ndash; вот&amp;nbsp;некоторые примеры:&lt;br />
Принудительная аутентификация перед всеми действиями контроллера&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">NotesController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Не&amp;nbsp;хотите,&amp;nbsp;чтобы&amp;nbsp;неаутентифицированный&amp;nbsp;пользователь&amp;nbsp;бродил&amp;nbsp;по&amp;nbsp;каким-либо&amp;nbsp;действия&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;в&amp;nbsp;этом&amp;nbsp;контроллере?&amp;nbsp;Воспользуйтесь&amp;nbsp;beforeFilter,&amp;nbsp;чтобы&amp;nbsp;запускать&amp;nbsp;checkSession&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;перед&amp;nbsp;любым&amp;nbsp;кодом&amp;nbsp;действия.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">beforeFilter&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">checkSession&lt;/span>&lt;span style="color: #007700">();&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Принудительная аутентификация перед одним действием контроллера&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">NotesController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">publicNotes&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$clientID&lt;/span>&lt;span style="color: #007700">)&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Публичный&amp;nbsp;доступ&amp;nbsp;к&amp;nbsp;этому&amp;nbsp;действию&amp;nbsp;открыт....&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">edit&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$noteId&lt;/span>&lt;span style="color: #007700">)&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Но&amp;nbsp;вы&amp;nbsp;хотите,&amp;nbsp;что&amp;nbsp;бы&amp;nbsp;этим&amp;nbsp;действием&amp;nbsp;пользовались&amp;nbsp;только&amp;nbsp;аутентифицированные&amp;nbsp;пользователи.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">checkSession&lt;/span>&lt;span style="color: #007700">();&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Теперь вы&amp;nbsp;получили основы, вы&amp;nbsp;можете усовершенствовать возможности аутентификации или&amp;nbsp;настроить их&amp;nbsp;по своему желанию или&amp;nbsp;нуждам. Интеграция с&amp;nbsp;компонентом ACL&amp;nbsp;Cake может быть отличным шагом.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;!--notypo-->&lt;fieldset class="table_of_contents">&lt;legend>&lt;strong> Оглавление документа   &lt;/strong>&lt;/legend>&lt;div class="toc1">&lt;a href="#h42-2">Общая картина&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-3">Аутентификация и&amp;nbsp;стойкость&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-4">Проверка доступа в&amp;nbsp;вашем приложении&lt;/a>&lt;/div>&lt;/fieldset>&lt;!--/notypo--> yrt&lt;br />
Для&amp;nbsp;всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?&lt;br />
Для&amp;nbsp;всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-02-01 15:48:47</title>
<link>http://cake-php.ru/wiki/Manual11/SimpleUserAuth/show?time=2008-02-01+15%3A48%3A47</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Simple&amp;nbsp;User&amp;nbsp;Auth&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-02-01+15%3A48%3A47">2008-02-01 15:48:47&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-02-01+15%3A49%3A33">2008-02-01 15:49:33&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">Для&amp;nbsp;всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?&lt;br />
Для&amp;nbsp;всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?Для всех, кто&amp;nbsp;не&amp;nbsp;сильно заморачивается на&amp;nbsp;тему какого года одежка, в&amp;nbsp;Спортмастере как&amp;nbsp;обычно можно вырубить прошлогодние доски и&amp;nbsp;некоторую одежду c&amp;nbsp;приятным скидоном в&amp;nbsp;50%. А&amp;nbsp;в дисконтном Спортмастере, который расположен в&amp;nbsp;районе Ленинского проспекта можно затариться катальными куртками и&amp;nbsp;штанами &lt;span class="missingpage">O'&amp;nbsp;Neal&lt;/span>&lt;a href="http://cake-php.ru/wiki/O'Neal/edit?add=1" title="Создать эту страницу">?&lt;/a>, Quiksilver, Nike, Salomon и&amp;nbsp;пр.&lt;br />
Так&amp;nbsp;же&amp;nbsp;там скидоны и&amp;nbsp;на маски, всегда приятно прикупить Oakley с&amp;nbsp;хорошим скидоном, особенно с&amp;nbsp;учетом того, что&amp;nbsp;обычно более &lt;span class="nobr">10&amp;ndash;15&lt;/span>% обычно в&amp;nbsp;магазинах ожидать нечего, а&amp;nbsp;здесь максимум вроде 30% на&amp;nbsp;маски, но&amp;nbsp;тем не&amp;nbsp;менее.&lt;br />
P.S. Выбор одежды, масок и&amp;nbsp;досок конечно же&amp;nbsp;не такой огромный как&amp;nbsp;в&amp;nbsp;боардшопах аля&amp;nbsp;НеИгры, Провокатор, Quiksilver и&amp;nbsp;др., коллекции одежды тоже не&amp;nbsp;самое новьё, хотя Quiksilver вроде этого года!?&lt;br />
Вот&amp;nbsp;такая вот&amp;nbsp;инфа, возможно кому-нибудь будет полезной!?&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">Если вы&amp;nbsp;новичок в&amp;nbsp;CakePHP, вам&amp;nbsp;настоятельно рекомендуется копировать код&amp;nbsp;и&amp;nbsp;вставлять в&amp;nbsp;свое приложение для&amp;nbsp;использования. Если нет: эта&amp;nbsp;глава &amp;mdash; обсуждение ядра Cake, а&amp;nbsp;не безопасности приложений. Я&amp;nbsp;сомневаюсь, что&amp;nbsp;мы&amp;nbsp;будем обсуждать очевидные засады безопасности, главная цель этого примера &amp;ndash; показать как&amp;nbsp;работает ядро Cake, и&amp;nbsp;позволить вам&amp;nbsp;создавать пуленепробиваемые приложения.&lt;br />
В&amp;nbsp;Cake есть контроль доступа через встроенный движок ACL, но&amp;nbsp;как насчет аутентификации пользователей?&lt;br />
Что&amp;nbsp;ж, на&amp;nbsp;данный момент мы&amp;nbsp;установили, что&amp;nbsp;система аутентификации пользователей изменяется от&amp;nbsp;приложения к&amp;nbsp;приложению. Некоторые любят хешированные пароли, другие &amp;ndash; LDAP (Облегченный протокол доступа к&amp;nbsp;кталогам), и&amp;nbsp;почти все&amp;nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&amp;nbsp;оставляем это&amp;nbsp;на&amp;nbsp;вас. Изменится ли&amp;nbsp;это? Мы&amp;nbsp;не уверены пока. Сейчас, мы&amp;nbsp;думаем, что&amp;nbsp;большие накладные расходы при&amp;nbsp;встраивании этого в&amp;nbsp;фреймворк того не&amp;nbsp;стоят, потому что&amp;nbsp;создание собственной системы аутентификации пользователей с&amp;nbsp;Cake достаточно просто.&lt;br />
Вам&amp;nbsp;нужно всего три&amp;nbsp;вещи:&lt;br />
&lt;ol type="1">&lt;li> Способ аутентифицировать пользователей (обычно делается проверкой логина/пароля)
&lt;/li>&lt;li> Способ упорно следить что&amp;nbsp;пользователи путешествуют по&amp;nbsp;вашему приложению (обычно делается сессиями)
&lt;/li>&lt;li> Способ проверить аутентифицировался ли&amp;nbsp;пользователь (обычно устанавливается с&amp;nbsp;помощью взаимодействия с&amp;nbsp;сессиями)&lt;/li>&lt;/ol>
В&amp;nbsp;этом примере, мы&amp;nbsp;создадим простую систему аутентификации пользователей для&amp;nbsp;системы управления клиентами. Это&amp;nbsp;вымышленное приложение скорее всего будет использоваться в&amp;nbsp;офисе, чтобы следить за&amp;nbsp;контактной информацией и&amp;nbsp;соответсвенными заметками клиентов. Вся&amp;nbsp;функциональность системы будет размещена за&amp;nbsp;нашей системой аутентификации пользователей, кроме нескольких отображений, которые будут показывать только имена и&amp;nbsp;титулы клиентов, сохраненные в&amp;nbsp;системе.&lt;br />
Мы&amp;nbsp;начнем с&amp;nbsp;того, что&amp;nbsp;покажем вам&amp;nbsp;как проверить пользователей, которые пытаются получить доступ к&amp;nbsp;системе. Информация об&amp;nbsp;аутентифицированном пользователе будет храниться в&amp;nbsp;сессии PHP, используя компонент сессий. Когда у&amp;nbsp;нас есть информация пользователя в&amp;nbsp;сессии, мы&amp;nbsp;поместим проверки в&amp;nbsp;приложение, чтобы убедится, что&amp;nbsp;пользователь не&amp;nbsp;пытается добраться до&amp;nbsp;мест, куда ему&amp;nbsp;&amp;laquo;не нужно&amp;raquo; добираться.&lt;br />
На&amp;nbsp;заметку &amp;ndash; аутентификация это&amp;nbsp;не&amp;nbsp;то же&amp;nbsp;самое что&amp;nbsp;и&amp;nbsp;контроль доступа. Все&amp;nbsp;что нам&amp;nbsp;нужно в&amp;nbsp;этом примере это&amp;nbsp;являются ли&amp;nbsp;пользователи теми, кем&amp;nbsp;себя заявляют, и&amp;nbsp;дать им&amp;nbsp;основной доступ к&amp;nbsp;частям приложения. Мы&amp;nbsp;будем делать заметки где&amp;nbsp;можно разместить ACL, но&amp;nbsp;пока, давайте сфокусируемся на&amp;nbsp;простой аутентификации пользователей.&lt;br />
Я&amp;nbsp;также должен отметить, что&amp;nbsp;этот пример не&amp;nbsp;претендует на&amp;nbsp;звание какого-то букваря в&amp;nbsp;безопасности приложения. Мы&amp;nbsp;просто хотим дать вам&amp;nbsp;достаточно, чтобы вы&amp;nbsp;могли создать защищенные приложения самостоятельно.&lt;a name="h42-1">&lt;/a>&lt;h2>Аутентификация и&amp;nbsp;стойкость&lt;/h2>
Сначала нам&amp;nbsp;нужен способ хранить информацию о&amp;nbsp;пользователях, пытающихся получить доступ к&amp;nbsp;нашей системе управления клиентами. Система, которую мы&amp;nbsp;используем хранит информацию о&amp;nbsp;пользователях в&amp;nbsp;таблице базы данных, которая была создана согласно следующему SQL:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;font color=blue>Table&lt;/font>&amp;nbsp;'users',&amp;nbsp;Fictional&amp;nbsp;Client&amp;nbsp;Management&amp;nbsp;System&amp;nbsp;&lt;font color=blue>Database&lt;/font>&lt;br />
&lt;font color=blue>CREATE&lt;/font>&amp;nbsp;&lt;font color=blue>TABLE&lt;/font>&amp;nbsp;`users`&amp;nbsp;(&lt;br />
&amp;nbsp;&amp;nbsp;`id`&amp;nbsp;&lt;font color=blue>int&lt;/font>(&lt;font color=green>&lt;b>11&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>&amp;nbsp;auto_increment,&lt;br />
&amp;nbsp;&amp;nbsp;`username`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>255&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;`password`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>32&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;`first_name`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>255&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;`last_name`&amp;nbsp;&lt;font color=blue>varchar&lt;/font>(&lt;font color=green>&lt;b>255&lt;/b>&lt;/font>)&amp;nbsp;&lt;font color=blue>NOT&lt;/font>&amp;nbsp;&lt;font color=blue>NULL&lt;/font>,&lt;br />
&amp;nbsp;&amp;nbsp;&lt;font color=blue>PRIMARY&lt;/font>&amp;nbsp;&lt;font color=blue>KEY&lt;/font>&amp;nbsp;&amp;nbsp;(`id`)&lt;br />
)&lt;font color=green>&lt;b>&lt;/b>&lt;/font>&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Достаточно просто, не&amp;nbsp;так ли? Модель Cake для&amp;nbsp;этой таблицы может быть достаточно ясной:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">User&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppModel&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$name&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;nbsp;&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">;&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Первое, что&amp;nbsp;нам нужно это&amp;nbsp;отображение и&amp;nbsp;действие логина. Это&amp;nbsp;даст возможность пользователям логиниться и&amp;nbsp;возможность системе обрабатывать информацию, чтобы узнать давать пользователю доступ или&amp;nbsp;нет. Отображение это&amp;nbsp;простая форма HTML, созданная при&amp;nbsp;помощи HTML Хелпера:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
/app/views/users/login.thtml&lt;br />&lt;span style="color: #0000BB">&amp;lt;?&lt;/span>&lt;span style="color: #007700">if&amp;nbsp;(&lt;/span>&lt;span style="color: #0000BB">$error&lt;/span>&lt;span style="color: #007700">):&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;p&amp;gt;The&amp;nbsp;login&amp;nbsp;credentials&amp;nbsp;you&amp;nbsp;supplied&amp;nbsp;could&amp;nbsp;not&amp;nbsp;be&amp;nbsp;recognized.&amp;nbsp;Please&amp;nbsp;try&amp;nbsp;again.&amp;lt;/p&amp;gt;&lt;br />&lt;span style="color: #0000BB">&amp;lt;?&amp;nbsp;&lt;/span>&lt;span style="color: #007700">endif;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;form&amp;nbsp;action="&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">url&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/users/login'&lt;/span>&lt;span style="color: #007700">);&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>"&amp;nbsp;method="post"&amp;gt;&lt;br />&amp;lt;div&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;label&amp;nbsp;for="username"&amp;gt;Username:&amp;lt;/label&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">input&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User/username'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;array(&lt;/span>&lt;span style="color: #DD0000">'size'&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;gt;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">20&lt;/span>&lt;span style="color: #007700">));&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;/div&amp;gt;&lt;br />&amp;lt;div&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;label&amp;nbsp;for="password"&amp;gt;Password:&amp;lt;/label&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">password&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User/password'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;array(&lt;/span>&lt;span style="color: #DD0000">'size'&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;gt;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">20&lt;/span>&lt;span style="color: #007700">));&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;/div&amp;gt;&lt;br />&amp;lt;div&amp;gt;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB">&amp;lt;?php&amp;nbsp;&lt;/span>&lt;span style="color: #007700">echo&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$html&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">submit&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'Login'&lt;/span>&lt;span style="color: #007700">);&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;br />&lt;/span>&amp;lt;/div&amp;gt;&lt;br />&amp;lt;/form&amp;gt;&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Это&amp;nbsp;отображение предоставляет простую форму логина для&amp;nbsp;пользователей пытающихся получить доступ к&amp;nbsp;системе. Действие для&amp;nbsp;формы это&amp;nbsp;/users/login, находится в&amp;nbsp;&lt;span class="missingpage">Users&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/UsersController/edit?add=1" title="Создать эту страницу">?&lt;/a> и&amp;nbsp;выглядит так:&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
/app/controllers/users_controller.php&amp;nbsp;(частично)&lt;br />&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">UsersController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">login&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Не&amp;nbsp;показывать&amp;nbsp;сообщение&amp;nbsp;об&amp;nbsp;ошибке,&amp;nbsp;если&amp;nbsp;данные&amp;nbsp;не&amp;nbsp;были&amp;nbsp;отправлены.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">set&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'error'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">false&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Если&amp;nbsp;пользователь&amp;nbsp;отправил&amp;nbsp;данные&amp;nbsp;из&amp;nbsp;формы:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">if&amp;nbsp;(!empty(&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">data&lt;/span>&lt;span style="color: #007700">))&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Сначала&amp;nbsp;проверим,&amp;nbsp;есть&amp;nbsp;ли&amp;nbsp;пользователи&amp;nbsp;в&amp;nbsp;базе&amp;nbsp;данных&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//с&amp;nbsp;именем,&amp;nbsp;которое&amp;nbsp;предоставил&amp;nbsp;пользователь&amp;nbsp;в&amp;nbsp;форме:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$someone&amp;nbsp;&lt;/span>&lt;span style="color: #007700">=&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">User&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">findByUsername&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">data&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'username'&lt;/span>&lt;span style="color: #007700">]);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;На&amp;nbsp;этом&amp;nbsp;этапе&amp;nbsp;$someone&amp;nbsp;это&amp;nbsp;все&amp;nbsp;данные&amp;nbsp;пользователя,&amp;nbsp;или&amp;nbsp;же&amp;nbsp;она&amp;nbsp;пуста.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Давайте&amp;nbsp;сравним&amp;nbsp;пароль&amp;nbsp;из&amp;nbsp;формы&amp;nbsp;с&amp;nbsp;паролем&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//из&amp;nbsp;базы&amp;nbsp;данных.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">if(!empty(&lt;/span>&lt;span style="color: #0000BB">$someone&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'password'&lt;/span>&lt;span style="color: #007700">])&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$someone&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'password'&lt;/span>&lt;span style="color: #007700">]&amp;nbsp;==&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">data&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">][&lt;/span>&lt;span style="color: #DD0000">'password'&lt;/span>&lt;span style="color: #007700">])&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Заметка:&amp;nbsp;надеемся&amp;nbsp;что&amp;nbsp;пароли&amp;nbsp;в&amp;nbsp;вашей&amp;nbsp;БД&amp;nbsp;хешированы,&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;так&amp;nbsp;что&amp;nbsp;ваше&amp;nbsp;сравнение&amp;nbsp;может&amp;nbsp;выглядеть&amp;nbsp;так:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;md5($this-&amp;gt;data['User']['password'])&amp;nbsp;==&amp;nbsp;...&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Это&amp;nbsp;значит,&amp;nbsp;что&amp;nbsp;они&amp;nbsp;были&amp;nbsp;одинаковыми.&amp;nbsp;Теперь&amp;nbsp;мы&amp;nbsp;можем&amp;nbsp;создавать&amp;nbsp;некую&amp;nbsp;основную&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//информацию&amp;nbsp;сессии,&amp;nbsp;чтобы&amp;nbsp;запомнить&amp;nbsp;этого&amp;nbsp;пользователя&amp;nbsp;как&amp;nbsp;"залогиненого".&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Session&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">write&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$someone&lt;/span>&lt;span style="color: #007700">[&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">]);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Теперь,&amp;nbsp;когда&amp;nbsp;у&amp;nbsp;нас&amp;nbsp;они&amp;nbsp;сохранены&amp;nbsp;в&amp;nbsp;сессии,&amp;nbsp;перенаправим&amp;nbsp;их&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//на&amp;nbsp;нужную&amp;nbsp;страницу&amp;nbsp;в&amp;nbsp;приложении.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">redirect&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/clients'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//В&amp;nbsp;другом&amp;nbsp;случае,&amp;nbsp;они&amp;nbsp;предоставили&amp;nbsp;не&amp;nbsp;верные&amp;nbsp;данные:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">else&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Помните&amp;nbsp;переменную&amp;nbsp;$error&amp;nbsp;в&amp;nbsp;отображении?&amp;nbsp;Давайте&amp;nbsp;поставим&amp;nbsp;ее&amp;nbsp;на&amp;nbsp;true:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">set&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'error'&lt;/span>&lt;span style="color: #007700">,&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">true&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">logout&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Перенаправляем&amp;nbsp;пользователя&amp;nbsp;на&amp;nbsp;это&amp;nbsp;действие,&amp;nbsp;если&amp;nbsp;они&amp;nbsp;нажали&amp;nbsp;кнопку&amp;nbsp;Выйти.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Все&amp;nbsp;что&amp;nbsp;нам&amp;nbsp;здесь&amp;nbsp;нужно,&amp;nbsp;это&amp;nbsp;удалить&amp;nbsp;информацию&amp;nbsp;сессии:&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Session&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">delete&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Ну&amp;nbsp;и&amp;nbsp;наверняка&amp;nbsp;нам&amp;nbsp;нужно&amp;nbsp;перенаправить&amp;nbsp;их&amp;nbsp;куда-нибудь...&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">redirect&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Не&amp;nbsp;плохо: содержание действия login() может быть меньше 20 линий, если вы&amp;nbsp;были лаконичны. Результат этого действия либо 1: информация пользователя записана в&amp;nbsp;сессию и&amp;nbsp;он перенаправлен на&amp;nbsp;нужную страницу приложения, или&amp;nbsp;2: отброшен обратно на&amp;nbsp;страницу входа (в дополнении с&amp;nbsp;сообщением об&amp;nbsp;ошибке).&lt;a name="h42-2">&lt;/a>&lt;h2>Проверка доступа в&amp;nbsp;вашем приложении&lt;/h2>
Теперь мы&amp;nbsp;можем аутентифицировать пользователей, давайте сделаем так, что&amp;nbsp;приложение будет отбрасывать пользователей, пытающихся пробраться в&amp;nbsp;систему не&amp;nbsp;из формы логина или&amp;nbsp;&amp;laquo;основной&amp;raquo; директории клиентов.&lt;br />
Один способ это&amp;nbsp;создать функцию в&amp;nbsp;&lt;span class="missingpage">App&amp;nbsp;Controller&lt;/span>&lt;a href="http://cake-php.ru/wiki/AppController/edit?add=1" title="Создать эту страницу">?&lt;/a>, которая будет делать проверку сессии и&amp;nbsp;отбрасывание.&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
/app/app_controller.php&lt;br />&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">Controller&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">checkSession&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Если&amp;nbsp;иформация&amp;nbsp;сессии&amp;nbsp;не&amp;nbsp;была&amp;nbsp;установлена...&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">if&amp;nbsp;(!&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">Session&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">check&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'User'&lt;/span>&lt;span style="color: #007700">))&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Отправляет&amp;nbsp;пользователя&amp;nbsp;к&amp;nbsp;экрану&amp;nbsp;логина&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">redirect&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #DD0000">'/users/login'&lt;/span>&lt;span style="color: #007700">);&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit();&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Теперь у&amp;nbsp;вас есть функция, которую вы&amp;nbsp;можете использовать в&amp;nbsp;любом контроллере, чтобы убедиться что&amp;nbsp;пользователи не&amp;nbsp;пытаются добраться до&amp;nbsp;действий контроллера, не&amp;nbsp;залогинившись до&amp;nbsp;этого. Когда она&amp;nbsp;на&amp;nbsp;месте вы&amp;nbsp;можете проверять доступ на&amp;nbsp;любом уровне &amp;ndash; вот&amp;nbsp;некоторые примеры:&lt;br />
Принудительная аутентификация перед всеми действиями контроллера&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">NotesController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Не&amp;nbsp;хотите,&amp;nbsp;чтобы&amp;nbsp;неаутентифицированный&amp;nbsp;пользователь&amp;nbsp;бродил&amp;nbsp;по&amp;nbsp;каким-либо&amp;nbsp;действия&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;в&amp;nbsp;этом&amp;nbsp;контроллере?&amp;nbsp;Воспользуйтесь&amp;nbsp;beforeFilter,&amp;nbsp;чтобы&amp;nbsp;запускать&amp;nbsp;checkSession&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;перед&amp;nbsp;любым&amp;nbsp;кодом&amp;nbsp;действия.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">beforeFilter&lt;/span>&lt;span style="color: #007700">()&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">checkSession&lt;/span>&lt;span style="color: #007700">();&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Принудительная аутентификация перед одним действием контроллера&lt;br />
&lt;!--notypo-->&lt;div class="code">&lt;code>&lt;span style="color: #000000">
&lt;span style="color: #0000BB">&amp;lt;?php&lt;br />&lt;/span>&lt;span style="color: #007700">class&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">NotesController&amp;nbsp;&lt;/span>&lt;span style="color: #007700">extends&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">AppController&lt;br />&lt;/span>&lt;span style="color: #007700">{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">publicNotes&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$clientID&lt;/span>&lt;span style="color: #007700">)&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//Публичный&amp;nbsp;доступ&amp;nbsp;к&amp;nbsp;этому&amp;nbsp;действию&amp;nbsp;открыт....&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #007700">}&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">edit&lt;/span>&lt;span style="color: #007700">(&lt;/span>&lt;span style="color: #0000BB">$noteId&lt;/span>&lt;span style="color: #007700">)&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #FF8000">//&amp;nbsp;Но&amp;nbsp;вы&amp;nbsp;хотите,&amp;nbsp;что&amp;nbsp;бы&amp;nbsp;этим&amp;nbsp;действием&amp;nbsp;пользовались&amp;nbsp;только&amp;nbsp;аутентифицированные&amp;nbsp;пользователи.&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span>&lt;span style="color: #0000BB">$this&lt;/span>&lt;span style="color: #007700">-&amp;gt;&lt;/span>&lt;span style="color: #0000BB">checkSession&lt;/span>&lt;span style="color: #007700">();&lt;br />&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br />}&lt;br />&lt;/span>&lt;span style="color: #0000BB">?&amp;gt;&lt;/span>
&lt;/span>
&lt;/code>&lt;/div>&lt;!--/notypo-->&lt;br />
Теперь вы&amp;nbsp;получили основы, вы&amp;nbsp;можете усовершенствовать возможности аутентификации или&amp;nbsp;настроить их&amp;nbsp;по своему желанию или&amp;nbsp;нуждам. Интеграция с&amp;nbsp;компонентом ACL&amp;nbsp;Cake может быть отличным шагом.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2008-01-17 15:48:29</title>
<link>http://cake-php.ru/wiki/Manual11/SimpleUserAuth/show?time=2008-01-17+15%3A48%3A29</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Simple&amp;nbsp;User&amp;nbsp;Auth&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-01-17+15%3A48%3A29">2008-01-17 15:48:29&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-02-01+15%3A48%3A47">2008-02-01 15:48:47&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;!--notypo-->&lt;fieldset class="table_of_contents">&lt;legend>&lt;strong> Оглавление документа   &lt;/strong>&lt;/legend>&lt;div class="toc1">&lt;a href="#h42-2">Общая картина&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-3">Аутентификация и&amp;nbsp;стойкость&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-4">Проверка доступа в&amp;nbsp;вашем приложении&lt;/a>&lt;/div>&lt;/fieldset>&lt;!--/notypo--> yrt&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;!--notypo-->&lt;fieldset class="table_of_contents">&lt;legend>&lt;strong> Оглавление документа   &lt;/strong>&lt;/legend>&lt;div class="toc1">&lt;a href="#h42-2">Общая картина&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-3">Аутентификация и&amp;nbsp;стойкость&lt;/a>&lt;/div>&lt;div class="toc1">&lt;a href="#h42-4">Проверка доступа в&amp;nbsp;вашем приложении&lt;/a>&lt;/div>&lt;/fieldset>&lt;!--/notypo-->&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2007-10-22 20:44:47</title>
<link>http://cake-php.ru/wiki/Manual11/SimpleUserAuth/show?time=2007-10-22+20%3A44%3A47</link>
<description>&lt;div class="pageBefore">&lt;img src="http://cake-php.ru/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth" class="">/Manual&amp;nbsp;11&amp;nbsp;/&amp;nbsp;Simple&amp;nbsp;User&amp;nbsp;Auth&lt;/a> за &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2007-10-22+20%3A44%3A47">2007-10-22 20:44:47&lt;/a> и &lt;a href="http://cake-php.ru/wiki/Manual11/SimpleUserAuth?time=2008-01-17+15%3A48%3A29">2008-01-17 15:48:29&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">В&amp;nbsp;Cake есть контроль доступа через встроенный движок ACL, но&amp;nbsp;как насчет аутентификации пользователей?&lt;br />
Что&amp;nbsp;ж, на&amp;nbsp;данный момент мы&amp;nbsp;установили, что&amp;nbsp;система аутентификации пользователей изменяется от&amp;nbsp;приложения к&amp;nbsp;приложению. Некоторые любят хешированные пароли, другие &amp;ndash; LDAP (Облегченный протокол доступа к&amp;nbsp;кталогам), и&amp;nbsp;почти все&amp;nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&amp;nbsp;оставляем это&amp;nbsp;на&amp;nbsp;вас. Изменится ли&amp;nbsp;это? Мы&amp;nbsp;не уверены пока. Сейчас, мы&amp;nbsp;думаем, что&amp;nbsp;большие накладные расходы при&amp;nbsp;встраивании этого в&amp;nbsp;фреймворк того не&amp;nbsp;стоят, потому что&amp;nbsp;создание собственной системы аутентификации пользователей с&amp;nbsp;Cake достаточно просто.&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">В&amp;nbsp;Cake есть контроль доступа через втроенный движок ACL, но&amp;nbsp;как насчет аутентификации пользователей? Как&amp;nbsp;насчет этого?&lt;br />
Что&amp;nbsp;ж, на&amp;nbsp;данный момент, мы&amp;nbsp;установили, что&amp;nbsp;система аутентификации пльзователей изменяется от&amp;nbsp;приложения к&amp;nbsp;приложению. Некоторые люят хешированные пароли, другие, LDAP (Облегченный протокол доступа к&amp;nbsp;кталогам) &amp;ndash; и&amp;nbsp;почти все&amp;nbsp;приложения содержат модели User, которые незначительно отличаются. Теперь мы&amp;nbsp;оставляем это&amp;nbsp;на&amp;nbsp;вас. Изменится ли&amp;nbsp;это? Мы&amp;nbsp;не уверены пока. Сейчас, мы&amp;nbsp;думаем, что&amp;nbsp;большие накладные расходы при&amp;nbsp;встаивании этого в&amp;nbsp;фреймворк того не&amp;nbsp;стоят, потому что&amp;nbsp;создание собственной системы аутентификации пользователей с&amp;nbsp;Cake достаточно просто.&lt;/div>&lt;/div>
</description>
</item>
</channel>
</rss>

