Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> RBAC, problem w zrozumieniu struktury DB
czachor
post 20.02.2008, 15:06:33
Post #1





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


Witam,
implementuję u siebie kontrolę dostępu opartą na tym: http://www.sqlrecipes.com/database_design/..._rbac_system-3/
Mam pytanie, szczególnie do tych, którzy korzystali z tego (o ile tacy są). Próbuję zrozumieć, po kiego są domeny (tabela rbac_domains)? W załączonych tam plikach jest metoda IsAllowedTo():
  1. <?php
  2. Function IsAllowedTo($id, $action, $object, $conn = ''){
  3.  
  4. if (!is_object($conn)){
  5. if (!isset($this->mConn)){
  6. trigger_error('Must supply database connection.', E_USER_ERROR);
  7. }
  8. else{
  9. $conn = $this->mConn;
  10. }
  11. }
  12.  
  13. // Check whether answer is already in sessions.
  14. if (isset($_SESSION['rbac_bv'][$id][$action][$object])) {
  15. if ($_SESSION['rbac_bv'][$id][$action][$object]){ // Do not touch. This if statement must be inside the parent if statement.
  16. return TRUE;
  17. } else {
  18. return FALSE;
  19. }
  20. }
  21.  
  22. // We order the role by importance. The most important role will come first. There
    fore when we loop through the record we will ignore
  23. // all other roles.
  24. $_sql = "
  25. SELECT is_allowed, t2.name AS privilege, t2.is_singular AS is_privilege_singular
    , t4.name AS action, t5.name AS domain, t5.is_singular AS is_domain_singular, t7.
    name AS object, t8.name as role, t8.importance
  26. FROM rbac_roles_has_domain_privileges AS t1
  27. -- Privileges Joins --
  28. INNER JOIN rbac_privileges AS t2 ON t2.id = t1.privileges_id 
  29. INNER JOIN rbac_privileges_has_actions AS t3 ON t3.privileges_id = t2.id
  30. INNER JOIN rbac_actions AS t4 ON t4.id = t3.actions_id
  31. -- Domain Joins --
  32. INNER JOIN rbac_domains AS t5 ON t5.id = t1.domains_id
  33. INNER JOIN rbac_domains_has_objects AS t6 ON t6.domains_id = t5.id
  34. INNER JOIN rbac_objects AS t7 ON t7.id = t6.objects_id
  35. -- Roles to user Joins --
  36. INNER JOIN rbac_roles AS t8 ON t8.id = t1.roles_id
  37. INNER JOIN rbac_users_has_roles AS t9 ON t9.roles_id = t8.id
  38. WHERE users_id = $id AND t4.name = '$action' AND t7.name = '$object'
  39. ORDER BY t8.importance DESC, t8.name
  40. ";
  41.  
  42. $conn->GetAll($_sql);
  43.  
  44. //----------------
  45. // Initialise variables.
  46. $weight = -1; // Used to find out which privileges take precedence.
  47. $is_allowed = 0; // FALSE, initialise
  48. $prev_importance = '';
  49. $count = 0;
  50.  
  51. // Loop through all matches
  52. while ($conn->NextRow(FALSE)){
  53.  
  54. $importance = $conn->importance;
  55. $is_allowed = (int) $conn->is_allowed;
  56.  
  57. // We are only interested in the roles with the most importance (i.e. Some roles may have the same importance.)
  58. if ($count > 0 && $importance !== $prev_importance){
  59. break;
  60. }
  61.  
  62. $new_weight = (int) $conn->is_privilege_singular + (int) $conn->is_domain_singular;
  63.  
  64. if ($new_weight > $weight){
  65. $weight = $new_weight;
  66. }
  67. else if ($new_weight == $weight && (int) $is_allowed === 1 && (int) $is_allowed === 0){
  68.  
  69. // We always give more weight to denials.
  70. $weight = $new_weight;
  71. }
  72.  
  73. // echo "Role is $conn->role and weight is $new_weight and is_allowed $conn->is_allowed ($is_allowed)<br>";
  74.  
  75. $prev_importance = $importance;
  76. $count++;
  77.  
  78. }
  79.  
  80. //------------------------------
  81. // Store value in sessions for next time.
  82. $_SESSION['rbac_bv'][$id][$action][$object] = $is_allowed;
  83. //session_write_close();
  84.  
  85. //-------------
  86. // Return answer
  87. if ($is_allowed){
  88. return TRUE;
  89. } else {
  90. return FALSE;
  91. }
  92. }
  93. ?>


Sprawdzanie dostępu jak rozumiem polega na sprawdzeniu, czy $user_id ma pozwolenie (is_allowed) na wykonanie akcji (np. "edit") na danym obiekcie (np. "member_page"). W takim razie po co są domeny (domains) i uprawnienia (privileges)? Niby są sprawdzane, czy są pojedyncze czy nie, ale nie widzę, żeby miało to jakieś znaczenie... Albo czegoś nie widzę albo jest to niepotrzebne... Będę wdzięczny za wskazówki.


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
nevt
post 20.02.2008, 15:31:29
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


z kodu wynika, że ma znaczenie, jeżeli w bazie jest kilka wpisów (inne dla usera inne dla domeny), to wg tego fragmentu:
  1. <?php
  2. $new_weight = (int) $conn->is_privilege_singular + (int) $conn->is_domain_singular;
  3.  
  4. if ($new_weight > $weight){
  5. $weight = $new_weight;
  6. }
  7. else if ($new_weight == $weight && (int) $is_allowed === 1 && (int) $is_allowed === 0){
  8.  
  9. // We always give more weight to denials.
  10. $weight = $new_weight;
  11. }
  12. ?>

zastosowane zostaną uprawnienia o wyższej "wadze"


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
czachor
post 26.02.2008, 21:34:06
Post #3





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


Hm... ale spójrz do tej funkcji... albo to nie jest zaimplementowane, albo tego nie ma po prostu... nie widzę, żeby gdziekolwiek było użyte $weight... Chyba po prostu to jest do rozbudowania.


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
arecki
post 26.02.2008, 21:53:23
Post #4





Grupa: Zarejestrowani
Postów: 222
Pomógł: 35
Dołączył: 6.02.2005

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


  1. <?php
  2. ... if ($new_weight == $weight && (int) $is_allowed === 1 && (int) $is_allowed === 0) { ...
  3. ?>


hmm... myślicie że instrukcja zawarta w tym bloku się kiedyś wykona ?


--------------------
Go to the top of the page
+Quote Post
czachor
post 26.02.2008, 22:00:50
Post #5





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


Właśnie siedzę i mam wrażenie, że to:
  1. <?php
  2. if ($count > 0 && $importance !== $prev_importance){
  3. break;
  4. }
  5. ?>

nie działa poprawnie... ta funkcja chyba jest zdecydowanie do przepisania.

Ale jakby ktoś mi jeszcze podpowiedział, do czego służy sprawdzanie wagi i jak w praktyce je wykorzystać... Szczególnie dlaczego pojedyncze (singular) domeny i uprawnienia mają większą wagę..


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
nevt
post 27.02.2008, 08:30:25
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


faktycznie cały ten kod kupy sie nie trzyma... całą pętle while() można zastąpć prostym pobraniem is_allowed z ostatniego wiersz wyniku $conn (ten warunek na break też nigdy nie jest spełniony) - ten kod wygląda albo na totalna niedoróbkę, albo na jakąś mocno testową wersję w trakcie rozwoju....


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
czachor
post 27.02.2008, 11:43:56
Post #7





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


No i nim chyba jest. Szkoda, że autor nie wspomniał o tym gdzieś... W każdym razie przepisałem sobie to jakoś. Struktura bazy wydaje się, że jest w porządku. Narazie utknąłem na znaczeniu tych wag, nie wiem, dlaczego pojedyncze domeny i uprawnienia mają większe i jak to się przekłada na wynik, ale mam nadzieję, że dojdę. Póki co działa mi bez tego tak jak powinno...


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
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: 8.07.2025 - 09:48