Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [kohana] Ocena Modelu Autoryzacji Użytkowników
Forum PHP.pl > Inne > Oceny
k3nsei
Chciał bym abyście ocenili i skomentowali mój model autoryzacji. Jestem właśnie na etapie jego pisania więc chciał bym się dowiedzieć co zmodyfikować, dodać i usunąć.
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. class User_Model extends Model
  4. {
  5. protected $prefix;
  6. protected $session;
  7. protected $input;
  8.  
  9. public function __construct()
  10. {
  11. parent::__construct();
  12. $this->session = new Session;
  13. $this->input = new Input;
  14. $this->prefix = config::item('database.default.table_prefix');
  15. }
  16.  
  17. public function makeAutoLogIn()
  18. {
  19. $cookie_data = cookie::get('Authentication');
  20. $login = NULL;
  21. $cookie_key = NULL;
  22.  
  23. if($cookie_data !== NULL and $this->session->get('isLogin', FALSE) === FALSE)
  24. {
  25. $data = explode('-', $cookie_data);
  26. $cookie_key = $this->session->id();
  27. $cookie_name = 'Authentication';
  28. $cookie_value = $data[0].'-'.$cookie_key;
  29. $cookie_expire = 60*60*24*30;
  30.  
  31. cookie::delete($cookie_name);
  32. cookie::set($cookie_name, $cookie_value, $cookie_expire);
  33.  
  34. $this->db->select('users.user_id, users.user_email, users.user_name, users.user_logins_count, users
    .user_last_login, users_roles.role_id'
    );
  35. $this->db->from('users');
  36. $this->db->join('users_roles', 'users_roles.user_id = users.user_id');
  37. $this->db->where(array('users.user_id' => $data[0], 'users.user_cookie_key' => $data[1]));
  38. $query = $this->db->get()->result_array();
  39.  
  40. foreach($query as $row)
  41. {
  42. $this->session->set('isLogin', TRUE);
  43. $this->session->set('id', $row->user_id);
  44. $this->session->set('login', $row->user_name);
  45. $this->session->set('email', $row->user_email);
  46. $this->session->set('lastvisit', $row->user_last_login);
  47. $this->session->set('role', $row->role_id);
  48. $this->db->from('users');
  49. $this->db->set(array('user_logins_count' => $row->user_logins_count+1, 'user_cookie_key' => $cookie_key, 'user_last_ip' => $this->input->ip_address(), 'user_last_login' => mktime()));
  50. $this->db->where(array('user_id' => $data[0], 'user_cookie_key' => $data[1]));
  51. $this->db->update();
  52. }
  53.  
  54. return (bool) TRUE;
  55. }
  56. else
  57. {
  58. return (bool) FALSE;
  59. }
  60. }
  61.  
  62. public function makeLogIn($login = NULL, $password = NULL, $auto = FALSE)
  63. {
  64. $cookie_key = $this->session->id();
  65. cookie::delete('Authentication');
  66. $check = $this->db->select('user_id, user_salt_begin, user_salt_end')->from('users')->where('users.user_name', $login)->get()->current();
  67.  
  68. if($auto === TRUE)
  69. {
  70. $cookie_name = 'Authentication';
  71. $cookie_value = $check->user_id.'-'.$cookie_key;
  72. $cookie_expire = 60*60*24*30;
  73. cookie::set($cookie_name, $cookie_value, $cookie_expire);
  74. }
  75.  
  76. if($login !== NULL and $password !== NULL and $this->session->get('isLogin', FALSE) === FALSE)
  77. {
  78. $this->db->select('users.user_id, users.user_email, users.user_name, users.user_logins_count, users
    .user_last_login, users_roles.role_id'
    );
  79. $this->db->from('users');
  80. $this->db->join('users_roles', 'users_roles.user_id = users.user_id');
  81. $this->db->where(array('users.user_name' => $login, 'users.user_password' => sha1($check->user_salt_begin.md5($password).$check->user_salt_end)));
  82. $query = $this->db->get()->result_array();
  83.  
  84. foreach($query as $row)
  85. {
  86. $this->session->set('isLogin', TRUE);
  87. $this->session->set('id', $row->user_id);
  88. $this->session->set('login', $row->user_name);
  89. $this->session->set('email', $row->user_email);
  90. $this->session->set('lastvisit', $row->user_last_login);
  91. $this->session->set('role', $row->role_id);
  92. $this->db->from('users');
  93. $this->db->set(array('user_logins_count' => $row->user_logins_count+1, 'user_cookie_key' => $cookie_key, 'user_last_ip' => $this->input->ip_address(), 'user_last_login' => mktime()));
  94. $this->db->where(array('users.user_name' => $login, 'users.user_password' => sha1($check->user_salt_begin.md5($password).$check->user_salt_end)));
  95. $this->db->update();
  96. }
  97.  
  98. return (bool) TRUE;
  99. }
  100. else
  101. {
  102. return (bool) FALSE;
  103. }
  104. }
  105.  
  106. public function makeLogOut()
  107. {
  108. $this->session->destroy();
  109. cookie::delete('Authentication');
  110. }
  111.  
  112. public function isAnonymous()
  113. {
  114. if($this->session->get('isLogin', FALSE) === FALSE)
  115. {
  116. return (bool) TRUE;
  117. }
  118. else
  119. {
  120. return (bool) FALSE;
  121. }
  122. }
  123.  
  124. public function getData()
  125. {
  126. $data = array(
  127. 'isLogin' => (bool) $this->session->get('isLogin', FALSE),
  128. 'id' => (int) $this->session->get('id', 0),
  129. 'login' => (string) $this->session->get('login', NULL),
  130. 'email' => (string) $this->session->get('email', NULL),
  131. 'lastvisit' => (string) date('d.m.Y, H:i:s', $this->session->get('lastvisit', mktime())),
  132. 'role' => (int) $this->session->get('role', 1),
  133. 'IP' => (string) $this->input->ip_address(),
  134. 'Browser' => (string) Kohana::user_agent()
  135. );
  136. return (array) $data;
  137. }
  138.  
  139. public function getId()
  140. {
  141. return (int) $this->session->get('id', 0);
  142. }
  143.  
  144. public function getEmail()
  145. {
  146. return (string) $this->session->get('email', NULL);
  147. }
  148.  
  149. public function getLogin()
  150. {
  151. return (string) $this->session->get('login', NULL);
  152. }
  153.  
  154. public function getLastvisit()
  155. {
  156. return (int) $this->session->get('lastvisit', mktime());
  157. }
  158.  
  159. public function getRole()
  160. {
  161. return (int) $this->session->get('role', 1);
  162. }
  163.  
  164. public function getIp()
  165. {
  166. return (string) $this->input->ip_address();
  167. }
  168.  
  169. public function getBrowser()
  170. {
  171. return (string) Kohana::user_agent();
  172. }
  173. } // End User Model
  174. ?>
Cysiaczek
Cytat
var $db;


Teraz sobie poczytaj, dlaczego powstał framework Kohana i z jakiego innego projektu się wywodzi. Na stronie głównej projektu zwróć uwagę na słowa
Cytat
Strict PHP 5 OOP


1. Przenoszę na forum Oceny

2. Oceniam: skończyłem czytać na słówku var tongue.gif

Pozdrawiam.
.radex
mógłbyś zamienić [ code ] na [ php ] ? Nieczytelnie jest tongue.gif
k3nsei
Cytat(Cysiaczek @ 25.06.2008, 16:03:58 ) *
Teraz sobie poczytaj, dlaczego powstał framework Kohana i z jakiego innego projektu się wywodzi. Na stronie głównej projektu zwróć uwagę na słowa


1. Przenoszę na forum Oceny

2. Oceniam: skończyłem czytać na słówku var tongue.gif

Pozdrawiam.


Dopiero co zaczynam programować w OOP więc nie bądź tak krytyczny, ale i tak już dawno to poprawiłem.
kwiateusz
reczne zapytania nie po to wymyslili tam active record?
k3nsei
A masz w active record inner join?
kwiateusz
ale update jest smile.gif jak najmniej czystych zapytań powinno sie stosowac jak już framework na to pozwala

co nie zmienia faktu ze za 1 razem nie zauwazylem joina
Cysiaczek
@radex_p - nie baw się w moderatora - jest funkcja raportuj

@k3nsei - Oddałeś kod do oceny, więc zakładałemm że wiesz, co robisz smile.gif
Nie podoba mi się umieszczenie w tej klasie metod makeAutoLogIn(), czy makeLogin() - to powinna robić akcja. Jeśli jednak masz to już tutaj, w modelu, to rozważyłbym przeniesienie metod dostępowych, które raczej są profilem użytkownika do klasy niżej. IMO, najlepiej osobna klasa do logowania. np.

  1. <?php
  2. class UserControll
  3. {
  4. function __construct(User_Model $user)
  5. {
  6. $this->user=$user;
  7. }
  8.  
  9.  function makeLogIn(){}
  10.  function makeAutoLogIn(){}
  11. }
  12. ?>


I już mamy większą elastyczność. No, w sumie, jeśli to miałby być komponent wielokrotnego użytku, to właśnie tak bym zrobił smile.gif

Pozdrawiam.
k3nsei
Właściwie to od logowania i wylogowania mam controller.
bełdzio
tylko ja w 50 lini widze SQLi ?

Cytat(k3nsei @ 25.06.2008, 16:16:33 ) *
A masz w active record inner join?

hmm join( ) questionmark.gif
k3nsei
Wtedy się sypie cały kod. Chyba że sam napiszesz mi active records do makeLogIn i makeAutoLogIn.
Macie jakieś pomysły na dodatkowe funkcję czy zastrzeżenia do obecnych oprócz logowania i autologowania?
bełdzio
sypie? ja u siebie korzystam z join( ) i wsio działa jak należy smile.gif
k3nsei
Zresztą quering też jest poprawny i o wiele szybciej mi się pisze i edytuje takie zapytania.

http://k3nsei.cal.pl/news/page/1.html

Login: Demo
Pass: Demo

możesz sobie przetestować.

Dodałem nową poprawioną wersję. Zapraszam do komentowania.
k3nsei
Oto mój nowy model autoryzacji użytkowników. Chciał bym abyście go skomentowali, co wam się nie podoba, co byście dodali i co byście zmienili. Jestem otwarty na wasze komentarze, dzięki nim mogę się wiele nauczyć i zrobić lepszą aplikacje.

http://phpfi.com/327959
Vengeance
Pierwsze co rzuca mi się w oczy do bezsensowne komentarze w stylu
  1. <?php
  2. return (bool) TRUE; // Return result
  3. }
  4. }
  5. else
  6. {
  7. return (bool) FALSE; // Return result
  8. }
  9. }
  10. else
  11. {
  12. return (bool) FALSE; // Return result
  13. }
  14. }
  15. else
  16. {
  17. return (bool) FALSE; // Return result
  18. ?>


Poza tym, metoda AddUser czy makeActive bardziej pasuje mi ogólnie do modelu bądź kontrolera użytkownika niż autoryzacji
Kolejna rzecz, czy te metody getEmail, getUserName itd nie łatwiej byłoby zastąpić po prostu np. poprzez pobranie instancji obiektu aktualnie zalogowanego użytkownika, a potem wszystko już z tego obiektu. Czyli zamiast
$auth->getEmail()
to
$auth->getUser()->getEmail()

tu wydaje się bardziej rozbudowane... ale tak nie jest, bo w przypadku dodawania kolejnych rzeczy musisz do klasy Auth dopisywać kolejne metody.

Jak dla mnie Auth powinno odpowiadać za: logowanie, wylogowanie, zalogowanie automatyczne, pobranie obiektu zalogowanego użytkownika, sprawdzanie uprawnień. finito.

Pozdrawiam
Cysiaczek
@autor - nie zakładamy nowych topików dla każdej kolejnej wersji. - połączyłem

Pozdrawiam
k3nsei
Vengeance przecież jest getData(). Ale nie zawsze trzeba pobierać całość, dlatego są też takie małe funkcje.
Vengeance
Chodzi mi oto, że takie rzeczy nie koniecznie muszą być w sesji (przynajmniej ja tak nie robie).
jarek_bolo
Witam, odświerzam trochę stary temat, bo chciałem zweryfikować czy dobrze zorumiałem recenzję oraz proponowane poprawki Venganca i Cysiaczka.

Jeśli dobrze was zrozumiałem to klasa Auth powinna być swego rodzaju zewnętrzną biblioteką (ani kontrolerem, ani modelem), którą używało by się w kontrolerach gdzie dostęp musi być autoryzowany.

I teraz ta klasa-zewnętrzna biblioteka Auth powinna mieć dostęp do Kohanowego "input'a" czyli (session, get, post, cookie) oraz modelu Users.
Wykorzystując Model oraz dane z input'a wykonuje odpowiednio, login, autologin, sprawdzenie uprawnień, logout.
Efekty swoich operacji powinna zwrócić do kontrolera aby ten dalej zdecydował co należy zrobić, jaki widok wyświetlić, itd.

I teraz chciałem się upewnić co do użycia takiej biblioteki.
Czy dobrze myślę patrząc w kontekście całej aplikacji, że taki moduł Auth jeśli mowa o ogólno dostępnej stronie powinien być używany w konkretnych, zamkniętych dla ogółu częściach (kontrolerach) aplikacji? Natomiast jeśli mamy na myśli ogólnie panel administratora to taki moduł Auth powinien być wpisany w konstruktor bazowego kontrolera, po którym dziedziczą wszystkie kontrolery panelu administracyjnego.

Czy dobrze sobie to wszystko wyobrażam??
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.