Zend_Auth.xml 20 KB

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