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