Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [kohana] Ocena Modelu Autoryzacji Użytkowników
k3nsei
post 25.06.2008, 12:43:35
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował k3nsei 26.06.2008, 11:53:56
Go to the top of the page
+Quote Post
Cysiaczek
post 25.06.2008, 15:03:58
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
.radex
post 25.06.2008, 15:05:41
Post #3





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


mógłbyś zamienić [ code ] na [ php ] ? Nieczytelnie jest tongue.gif


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
k3nsei
post 25.06.2008, 15:07:52
Post #4





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
kwiateusz
post 25.06.2008, 15:10:21
Post #5


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




reczne zapytania nie po to wymyslili tam active record?
Go to the top of the page
+Quote Post
k3nsei
post 25.06.2008, 15:16:33
Post #6





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


A masz w active record inner join?

Ten post edytował k3nsei 25.06.2008, 15:16:55
Go to the top of the page
+Quote Post
kwiateusz
post 25.06.2008, 15:23:53
Post #7


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




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
Go to the top of the page
+Quote Post
Cysiaczek
post 25.06.2008, 15:26:34
Post #8





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
k3nsei
post 25.06.2008, 15:30:46
Post #9





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


Właściwie to od logowania i wylogowania mam controller.
Go to the top of the page
+Quote Post
bełdzio
post 25.06.2008, 16:19:05
Post #10





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
k3nsei
post 25.06.2008, 16:23:51
Post #11





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


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?

Ten post edytował k3nsei 25.06.2008, 16:24:34
Go to the top of the page
+Quote Post
bełdzio
post 25.06.2008, 16:29:07
Post #12





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


sypie? ja u siebie korzystam z join( ) i wsio działa jak należy smile.gif


--------------------
Go to the top of the page
+Quote Post
k3nsei
post 26.06.2008, 11:54:36
Post #13





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
k3nsei
post 29.06.2008, 19:46:14
Post #14





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował k3nsei 29.06.2008, 19:52:01
Go to the top of the page
+Quote Post
Vengeance
post 29.06.2008, 22:42:38
Post #15





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post 30.06.2008, 01:24:20
Post #16





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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

Pozdrawiam


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
k3nsei
post 30.06.2008, 08:07:50
Post #17





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 25.06.2008

Ostrzeżenie: (0%)
-----


Vengeance przecież jest getData(). Ale nie zawsze trzeba pobierać całość, dlatego są też takie małe funkcje.
Go to the top of the page
+Quote Post
Vengeance
post 1.07.2008, 20:20:53
Post #18





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Chodzi mi oto, że takie rzeczy nie koniecznie muszą być w sesji (przynajmniej ja tak nie robie).


--------------------
Go to the top of the page
+Quote Post
jarek_bolo
post 8.09.2008, 17:34:55
Post #19





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

Ostrzeżenie: (0%)
-----


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??


--------------------
"Jeden człowiek nie zmieni świata, ale jeden człowiek może przekazać informację która zmieni świat." - David Icke
| PAMIĘTAJ, JESTEŚ POLAKIEM !!! |
Jam jest Polska, Ojczyzna Twoja, ziemia Ojców, z której wzrosłeś. Wszystko, czym jesteś, po Bogu - mnie zawdzięczasz!!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 12:48