Zend_Auth.xml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. <sect1 id="zend.auth.introduction">
  2. <title>Wprowadzenie</title>
  3. <para>
  4. Zend_Auth zapewnia API do uwierzytelniania oraz zawiera konkretne
  5. adaptery uwierzytelniania dla najczęstszych przypadków użycia.
  6. </para>
  7. <para>
  8. Komponent Zend_Auth jest związany tylko z
  9. <emphasis role="strong">uwierzytelnianiem</emphasis>, a nie z
  10. <emphasis role="strong">autoryzacją</emphasis>.
  11. Uwierzytelnianie luźno definiujemy jako określanie w oparciu o pewien
  12. zestaw danych tego, czy dana jednostka jest tym na co wygląda (np.
  13. identyfikacja). Autoryzacja, proces decydowania o tym, czy zezwolić
  14. danej jednostce na dostęp lub przeprowadzanie operacji na innych
  15. jednostkach, jest poza polem działania Zend_Auth. Aby uzyskać więcej
  16. informacji o autoryzacji i kontroli dostępu za pomocą Zend Framework,
  17. proszę zobacz <link linkend="zend.acl">Zend_Acl</link>.
  18. </para>
  19. <note>
  20. <para>
  21. Klasa <code>Zend_Auth</code> implementuje wzorzec singletona, czyli
  22. dostępna jest tylko jej jedna instancja - za pomocą statycznej
  23. metody <code>getInstance()</code>. Oznacza to, że użycie operatorów
  24. <code>new</code> oraz <code>clone</code> nie będzie możliwe z klasą
  25. <code>Zend_Auth</code>; zamiast nich użyj metody
  26. <code>Zend_Auth::getInstance()</code>.
  27. </para>
  28. </note>
  29. <sect2 id="zend.auth.introduction.adapters">
  30. <title>Adaptery</title>
  31. <para>
  32. Adapter Zend_Auth jest używany do uwierzytelniania na podstawie
  33. serwisu konkretnego typu, takiego jak LDAP, RDBMS, lub system plików.
  34. Różne adaptery mogą mieć różne opcje i mogą inaczej się zachowywać,
  35. ale niektóre podstawowe funkcjonalności są wspólne dla wszystkich
  36. adapterów. Na przykład akceptowanie danych uwierzytelniania,
  37. przeprowadzanie zapytań do serwisu uwierzytelniania i zwracanie
  38. rezultatów są wspólne dla adapterów Zend_Auth.
  39. </para>
  40. <para>
  41. Każda klasa adaptera Zend_Auth implementuje interfejs
  42. <code>Zend_Auth_Adapter_Interface</code>. Ten interfejs definiuje
  43. jedną metodę, <code>authenticate()</code>, którą klasa adaptera
  44. musi implementować dla zastosowań przeprowadzania zapytania
  45. uwierzytelniania. Każda klasa adaptera musi być przygotowana przed
  46. wywołaniem metody <code>authenticate()</code>. Przygotowanie takiego
  47. adaptera obejmuje ustawienie danych uwierzytelniania (np. nazwy
  48. użytkownika i hasła) oraz zdefiniowanie wartości dla specyficznych
  49. opcji adaptera, na przykład ustawienie połączenia do bazy danych dla
  50. adaptera tabeli bazy danych.
  51. </para>
  52. <para>
  53. Poniżej jest przykładowy adapter uwierzytelniania, który do
  54. przeprowadzenia procesu wymaga ustawionej nazwy użytkownika oraz
  55. hasła. Inne szczegóły, takie jak sposób przeprowadzania zapytania
  56. uwierzytelniającego, zostały pominięte w celu zwiększenia
  57. czytelności:
  58. <programlisting role="php"><![CDATA[
  59. class MyAuthAdapter implements Zend_Auth_Adapter_Interface
  60. {
  61. /**
  62. * Ustawia nazwę użytkownika oraz hasła dla uwierzytelniania
  63. *
  64. * @return void
  65. */
  66. public function __construct($username, $password)
  67. {
  68. // ...
  69. }
  70. /**
  71. * Przeprowadza próbę uwierzytelniania
  72. *
  73. * @throws Zend_Auth_Adapter_Exception Jeśli uwierzytelnianie
  74. * nie może być przeprowadzone
  75. * @return Zend_Auth_Result
  76. */
  77. public function authenticate()
  78. {
  79. // ...
  80. }
  81. }
  82. ]]>
  83. </programlisting>
  84. Jak pokazano w bloku dokumentacyjnym , metoda <code>authenticate()</code>
  85. musi zwracać instancję <code>Zend_Auth_Result</code> (lub instancję klasy
  86. rozszerzającej <code>Zend_Auth_Result</code>). Jeśli z jakiegoś
  87. powodu przeprowadzenie zapytania uwierzytelniającego jest niemożliwe,
  88. metoda <code>authenticate()</code> powinna wyrzucić wyjątek
  89. rozszerzający <code>Zend_Auth_Adapter_Exception</code>.
  90. </para>
  91. </sect2>
  92. <sect2 id="zend.auth.introduction.results">
  93. <title>Resultat</title>
  94. <para>
  95. Adaptery Zend_Auth zwracają instancję <code>Zend_Auth_Result</code>
  96. za pomocą metody <code>authenticate()</code> w celu przekazania
  97. rezultatu próby uwierzytelniania. Adaptery wypełniają obiekt
  98. <code>Zend_Auth_Result</code> podczas konstrukcji,
  99. dlatego poniższe cztery metody zapewniają podstawowy zestaw
  100. operacji, które są wspólne dla rezultatów adapterów Zend_Auth:
  101. <itemizedlist>
  102. <listitem>
  103. <para>
  104. <code>isValid()</code> - zwraca logiczną wartość true
  105. tylko wtedy, gdy rezultat reprezentuje udaną próbę
  106. uwierzytelniania.
  107. </para>
  108. </listitem>
  109. <listitem>
  110. <para>
  111. <code>getCode()</code> - zwraca identyfikator w postaci
  112. stałej klasy <code>Zend_Auth_Result</code> dla
  113. określenia powodu nieudanego uwierzytelniania lub
  114. sprawdzenia czy uwierzytelnianie się udało. Metoda może
  115. być użyta w sytuacjach gdy programista chce rozróżnić
  116. poszczególne typy wyników uwierzytelniania. Pozwala to
  117. na przykład programiście na zarządzanie szczegółowymi
  118. statystykami na temat wyników uwierzytelniania. Innym
  119. przykładem użycia tej funkcjonalności może być potrzeba
  120. zapewnienia wiadomości informujących użytkownika o
  121. przebiegu uwierzytelniania, ale jednak zalecane jest
  122. rozważenie ryzyka jakie zachodzi przy przekazywaniu
  123. użytkownikowi takich szczegółowych informacji, zamiast
  124. podstawowej informacji o błędzie. Aby uzyskać więcej
  125. informacji, zobacz poniżej.
  126. </para>
  127. </listitem>
  128. <listitem>
  129. <para>
  130. <code>getIdentity()</code> - zwraca tożsamość próby
  131. uwierzytelniania
  132. </para>
  133. </listitem>
  134. <listitem>
  135. <para>
  136. <code>getMessages()</code> - zwraca tablicę wiadomości
  137. odnoszących się do nieudanej próby uwierzytelniania
  138. </para>
  139. </listitem>
  140. </itemizedlist>
  141. </para>
  142. <para>
  143. Programista może chcieć przeprowadzić jakieś specyficzne akcje
  144. zależne od typu wyniku uwierzytelniania. Przykładami operacji,
  145. które programiści mogą uznać za użyteczne, mogą być: blokowanie
  146. kont po zbyt dużej ilości nieudanych próbach logowania, zapiywanie
  147. adresów IP po wpisaniu przez użytkownika nieistnięjącej nazwy
  148. tożsamości czy zapewnienie własnych zdefiniowanych komunikatów po
  149. próbie uwierzytelniania. Dostępne są takie kody wyników:
  150. <programlisting role="php"><![CDATA[
  151. Zend_Auth_Result::SUCCESS
  152. Zend_Auth_Result::FAILURE
  153. Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
  154. Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
  155. Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
  156. Zend_Auth_Result::FAILURE_UNCATEGORIZED
  157. ]]>
  158. </programlisting>
  159. </para>
  160. <para>
  161. Poniższy przykład pokazuje w jaki sposób programista może obsłużyć
  162. to kodzie:
  163. <programlisting role="php"><![CDATA[
  164. // wewnątrz akcji loginAction kontrolera AuthController
  165. $result = $this->_auth->authenticate($adapter);
  166. switch ($result->getCode()) {
  167. case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
  168. /** obsługujemy nieistniejącą tożsamość **/
  169. break;
  170. case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
  171. /** obsługujemy nieprawidłowe hasło **/
  172. break;
  173. case Zend_Auth_Result::SUCCESS:
  174. /** obsługujemy udane uwierzytelnianie **/
  175. break;
  176. default:
  177. /** obsługujemy inne błędy **/
  178. break;
  179. }
  180. ]]>
  181. </programlisting>
  182. </para>
  183. </sect2>
  184. <sect2 id="zend.auth.introduction.persistence">
  185. <title>Trwałość uwierzytelnionej tożsamości</title>
  186. <para>
  187. Uwierzytelnianie żądania, które zawiera dane uwierzytelniające jest
  188. samo w sobie użyteczne, ale ważna jest także obsługa
  189. uwierzytelnionej tożsamości bez konieczności dołączania danych
  190. uwierzytelniających do każdego żądania.
  191. </para>
  192. <para>
  193. HTTP jest protokołem niezachowującym stanu pomiędzy żądaniami,
  194. a techniki takie jak pliki cookie oraz sesje zostały stworzone w
  195. celu ułatwienia zarządzania stanem pomiędzy żądaniami w aplikacjach
  196. serwerowych.
  197. </para>
  198. <sect3 id="zend.auth.introduction.persistence.default">
  199. <title>Domyślne przechowywanie w sesji PHP</title>
  200. <para>
  201. Domyślnie <code>Zend_Auth</code> zapewnia trwały pojemnik do
  202. przechowywania tożsamości pochodzącej z udanej próby
  203. uwierzytelniania używając sesji PHP. Po udanej próbie
  204. uwierzytelniania, metoda <code>Zend_Auth::authenticate()</code>
  205. przechowuje wtrwałym pojemniku tożsamość pochodzącą z wyniku
  206. uwierzytelniania. Jeśli nie skonfigurujemy tego inaczej, klasa
  207. <code>Zend_Auth</code> użyje klasy pojemnika o nazwie
  208. <code>Zend_Auth_Storage_Session</code>, który używa klasy
  209. <link linkend="zend.session">Zend_Session</link>. Zamiast tego
  210. za pomocą metody <code>Zend_Auth::setStorage()</code> może być
  211. ustawiona własna klasa implementująca interfejs
  212. <code>Zend_Auth_Storage_Interface</code>.
  213. </para>
  214. <note>
  215. <para>
  216. Jeśli automatyczne przechowywanie tożsamości w trwałym
  217. pojemniku nie jest odpowiednie dla konkretnego przypadku
  218. użycia, to programiści mogą obyć się bez klasy
  219. <code>Zend_Auth</code>, a zamiast niej użyć bezpośrednio
  220. klasy adaptera.
  221. </para>
  222. </note>
  223. <example id="zend.auth.introduction.persistence.default.example">
  224. <title>Modyfikowanie przestrzeni nazw sesji</title>
  225. <para>
  226. <code>Zend_Auth_Storage_Session</code> używa przestrzeni
  227. nazw sesji o nazwie <code>'Zend_Auth'</code>. Ta przestrzeń
  228. nazw może być nadpisana przez przekazanie innej wartości do
  229. konstruktora klasy <code>Zend_Auth_Storage_Session</code>, a
  230. ta wartość wewnętrznie jest przekazywana do konstruktora
  231. klasy <code>Zend_Session_Namespace</code>. Powinno to
  232. nastąpić zanim przeprowadzone zostanie uwierzytelnianie,
  233. ponieważ metoda <code>Zend_Auth::authenticate()</code>
  234. automatycznie zapisuje dane tożsamości.
  235. <programlisting role="php"><![CDATA[
  236. // Zapisujemy referencję do pojedynczej instancji Zend_Auth
  237. $auth = Zend_Auth::getInstance();
  238. // Używamy przestrzeni nazw 'someNamespace' zamiast 'Zend_Auth'
  239. $auth->setStorage(new Zend_Auth_Storage_Session('someNamespace'));
  240. /**
  241. * @todo Ustawić adapter uwierzytelniania, $authAdapter
  242. */
  243. // Uwierzytelniamy, zapisując wynik i przechowując tożsamość
  244. // po udanym uwierzytelnieniu
  245. $result = $auth->authenticate($authAdapter);
  246. ]]>
  247. </programlisting>
  248. </para>
  249. </example>
  250. </sect3>
  251. <sect3 id="zend.auth.introduction.persistence.custom">
  252. <title>Implementacja własnego pojemnika</title>
  253. <para>
  254. Czasem programiści mogą potrzebować użyć innego sposobu
  255. trwałego przechowywania tożsamości niż ten zapewniony przez
  256. <code>Zend_Auth_Storage_Session</code>. W takich przypadkach
  257. programiści mogą po prostu zaimplementować interfejs
  258. <code>Zend_Auth_Storage_Interface</code> i przekazać instancję
  259. klasy do metody <code>Zend_Auth::setStorage()</code>.
  260. </para>
  261. <example id="zend.auth.introduction.persistence.custom.example">
  262. <title>Użycie własnej klasy do przechowywania tożsamości</title>
  263. <para>
  264. W celu użycia klasy trwale przechowującej tożsamość innej
  265. niż <code>Zend_Auth_Storage_Session</code>, programista
  266. implementuje interfejs
  267. <code>Zend_Auth_Storage_Interface</code>:
  268. <programlisting role="php"><![CDATA[
  269. class MyStorage implements Zend_Auth_Storage_Interface
  270. {
  271. /**
  272. * Zwraca wartość logiczną true tylko wtedy gdy pojemnik jest pusty
  273. *
  274. * @throws Zend_Auth_Storage_Exception Jeśli okreslenie czy pojemnik
  275. * jest pusty jest niemożliwe
  276. * @return boolean
  277. */
  278. public function isEmpty()
  279. {
  280. /**
  281. * @todo implementacja
  282. */
  283. }
  284. /**
  285. * Zwraca zawartość pojemnika
  286. *
  287. * Zachowanie jest nieokreślone w przypadku gdy pojemnik jest pusty.
  288. *
  289. * @throws Zend_Auth_Storage_Exception Jeśli odczyt zawartości
  290. * pojemnika jest niemożliwy
  291. * @return mixed
  292. */
  293. public function read()
  294. {
  295. /**
  296. * @todo implementacja
  297. */
  298. }
  299. /**
  300. * Zapisuje zawartość $contents w pojemniku
  301. *
  302. * @param mixed $contents
  303. * @throws Zend_Auth_Storage_Exception Jeśli zapisanie zawartości $contents
  304. * do pojemnika jest niemożliwe
  305. * @return void
  306. */
  307. public function write($contents)
  308. {
  309. /**
  310. * @todo implementacja
  311. */
  312. }
  313. /**
  314. * Czyści zawartość pojemnika
  315. *
  316. * @throws Zend_Auth_Storage_Exception Jeśli wyczyszczenie zawartości
  317. * pojemnika jest niemożliwe
  318. * @return void
  319. */
  320. public function clear()
  321. {
  322. /**
  323. * @todo implementacja
  324. */
  325. }
  326. }
  327. ]]>
  328. </programlisting>
  329. </para>
  330. <para>
  331. W celu użycia własnej klasy pojemnika, wywołaj metodę
  332. <code>Zend_Auth::setStorage()</code> przed przeprowadzeniem
  333. zapytania uwierzytelniającego:
  334. <programlisting role="php"><![CDATA[<?php
  335. // Instruujemy klasę Zend_Auth aby użyła niestandardowej klasy pojemnika
  336. Zend_Auth::getInstance()->setStorage(new MyStorage());
  337. /**
  338. * @todo Ustawić adapter uwierzytelniania, $authAdapter
  339. */
  340. // Uwierzytelniamy, zapisując wynik i przechowując tożsamość po udanym uwierzytelnieniu
  341. $result = Zend_Auth::getInstance()->authenticate($authAdapter);
  342. ]]>
  343. </programlisting>
  344. </para>
  345. </example>
  346. </sect3>
  347. </sect2>
  348. <sect2 id="zend.auth.introduction.using">
  349. <title>Użycie Zend_Auth</title>
  350. <para>
  351. Są dwa możliwe sposoby użycia adapterów Zend_Auth:
  352. <orderedlist>
  353. <listitem>
  354. <para>
  355. pośrednio, za pomocą metody
  356. <code>Zend_Auth::authenticate()</code>
  357. </para>
  358. </listitem>
  359. <listitem>
  360. <para>
  361. bezpośrednio, za pomocą metody <code>authenticate()</code>
  362. adaptera
  363. </para>
  364. </listitem>
  365. </orderedlist>
  366. </para>
  367. <para>
  368. Poniższy przykład pokazuje jak użyć adaptera Zend_Auth pośrednio,
  369. poprzez użycie klasy <code>Zend_Auth</code>:
  370. <programlisting role="php"><![CDATA[
  371. // Pobieramy instancję Zend_Auth
  372. $auth = Zend_Auth::getInstance();
  373. // Ustawiamy adapter uwierzytelniania
  374. $authAdapter = new MyAuthAdapter($username, $password);
  375. // Przeprowadzamy uwierzytelnianie, zapisując rezultat
  376. $result = $auth->authenticate($authAdapter);
  377. if (!$result->isValid()) {
  378. // Uwierzytelnianie nieudane; wyświetlamy powody
  379. foreach ($result->getMessages() as $message) {
  380. echo "$message\n";
  381. }
  382. } else {
  383. // Uwierzytelnianie udane; tożsamość ($username) jest zapisana w sesji
  384. // $result->getIdentity() === $auth->getIdentity()
  385. // $result->getIdentity() === $username
  386. }]]>
  387. </programlisting>
  388. </para>
  389. <para>
  390. Jeśli uwierzytelnianie zostało przeprowadzone w żądaniu tak jak w
  391. powyższym przykładzie, prostą sprawą jest sprawdzenie czy istnieje
  392. pomyślnie uwierzytelniona tożsamość:
  393. <programlisting role="php"><![CDATA[
  394. $auth = Zend_Auth::getInstance();
  395. if ($auth->hasIdentity()) {
  396. // Tożsamość istnieje; pobieramy ją
  397. $identity = $auth->getIdentity();
  398. }
  399. ]]>
  400. </programlisting>
  401. </para>
  402. <para>
  403. Aby usunąć tożsamość z trwałego pojemnika, użyj po prostu metody
  404. <code>clearIdentity()</code>. Typowo może być to użyte do
  405. implementacji w aplikacji operacji wylogowania:
  406. <programlisting role="php"><![CDATA[
  407. Zend_Auth::getInstance()->clearIdentity();
  408. ]]>
  409. </programlisting>
  410. </para>
  411. <para>
  412. Gdy automatyczne użycie trwałego pojemnika jest nieodpowiednie w
  413. konkretnym przypadku, programista może w prostu sposób ominąć
  414. użycie klasy <code>Zend_Auth</code>, używając bezpośrednio klasy
  415. adaptera. Bezpośrednie użycie klasy adaptera powoduje skonfigurowanie
  416. i przygotowanie obiektu adaptera, a następnie wywołanie metody
  417. <code>authenticate()</code>. Szczegóły specyficzne dla adaptera są
  418. opisane w dokumentacji dla każdego z adapterów. Poniższy przykład
  419. bezpośrednio używa <code>MyAuthAdapter</code>:
  420. <programlisting role="php"><![CDATA[
  421. // Ustawiamy adapter uwierzytelniania
  422. $authAdapter = new MyAuthAdapter($username, $password);
  423. // Przeprowadzamy uwierzytelnianie, zapisując rezultat
  424. $result = $authAdapter->authenticate();
  425. if (!$result->isValid()) {
  426. // Uwierzytelnianie nieudane; wyświetlamy powody
  427. foreach ($result->getMessages() as $message) {
  428. echo "$message\n";
  429. }
  430. } else {
  431. // Uwierzytelnianie udane
  432. // $result->getIdentity() === $username
  433. }
  434. ]]>
  435. </programlisting>
  436. </para>
  437. </sect2>
  438. </sect1>