Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: system uprawnień - koncepcja
Forum PHP.pl > Forum > PHP
japolak
myślę nad wprowadzeniem możliwości rejestracji użytkowników na swojej stronce. Stanąłem chwilowo w 1 punkcie zastanawiając się jaki byłby dobry w miarę elastyczny system uprawnień.
chodzi mi tu o to że np.
na początku były by 4 możliwe rangi.
Konto zbanowane, użytkownik, moder , admin
oczywiście każde konto musi mieć inne możliwości.

czy dobrym rozwiązaniem było by stworzyć w bazie osobną tabele w której zamieszczało by sie inf. jaka ranga ma dostęp do których modułów.
np. id_rank / moduł
1 / czytaj post
1 / dodaj post
1 / zobacz najnowsze
1 / usuń użytkownika
2 / czytaj post
itp itd

następnie po zalogowaniu ładowało by się nazwy modułów do tablicy i dalej przy próbie utworzenia obiektu sprawdzało czy użytkownik ma dostęp do danej opcji.

myślałem też o acl ale mi jakoś nie podchodzi..

proszę o doradzenie.. może macie lepsze rozwiązanie?
mortus
To, co zaproponowałeś, to właśnie ACL, które jest słusznym rozwiązaniem problemu.

EDIT
Implementacja ACL zależy oczywiście od programisty.
erix
Jeśli masz alergię na wyszukiwarkę, to daj sobie spokój: http://php.pl/Wortal/Artykuly/Proces-tworz...L-Jak-korzystac
kiler129
Jesteś osobą która raczej PHP zna więc pozwól, że pominę tłumaczenia i wkleję fragmnet klasy z własnego cmsu:

  1. <?php
  2. static public function encodeBitmask($uprawnieniaAsoc,$tabelaNazw){
  3. $liczba = 0;
  4. $ile=count($tabelaNazw);
  5. while($ile--){
  6. $liczba = $liczba<<1;
  7. if($uprawnieniaAsoc[$tabelaNazw[$ile]])$liczba=$liczba+1;
  8. }
  9. return $liczba;
  10. }
  11.  
  12. static public function decodeBitmask($liczba,$tabelaNazw){
  13. $uprawnieniaAsoc = array();
  14. foreach($tabelaNazw as $indeks){
  15. if($liczba&1)$uprawnieniaAsoc[$indeks]=true;
  16. else $uprawnieniaAsoc[$indeks]=false;
  17. $liczba = $liczba>>1;
  18. }
  19. return $uprawnieniaAsoc;
  20. }
  21.  
  22. static public function checkGrpActionRight($liczba,$uprawnienie) {
  23. $tabelaNazw = $this->bitmaskRights[array_shift(explode("_",$uprawnienie,2))];
  24. $id = array_search($uprawnienie, $tabelaNazw);
  25.  
  26. if($id===FALSE)return false;
  27. $liczba=$liczba>>$id;
  28. //var_dump($liczba); return;
  29. if($liczba&1)return true;
  30. return false;
  31. }
  32.  
  33. public static $bitmaskRights = array(
  34. "user" => array("userLogin", "comment", "adminLogin"), //General right like login
  35. "news" => array("list", "listMore", "add", "editOwn", "editOth", "delOwn", "delOth"), //News
  36. "ncats" => array("list", "add", "edit", "del"), //News categories
  37. "arts" => array("list", "listMore", "add", "publish", "editOwn", "editOth", "delOwn", "delOth"), //Articles
  38. "acats" => array("list", "add", "edit", "del"), //Articles categories
  39. "spgs" => array("list", "listMore", "add", "editOwn", "editOth", "delOwn", "delOth"), //Subpages
  40. "menu" => array("list", "add", "edit", "move", "del"), //Menu
  41. "paths" => array("list", "add", "edit", "del"), //Short paths
  42. "usrs" => array("list", "add", "edit", "del"), //Users
  43. "ugrps" => array("list", "add", "edit", "del"), //User groups
  44. "plgs" => array("list", "admin"), //Plugins
  45. "sets" => array("list", "edit"), //Settings
  46. "mtce" => array("list", "dbBckLst", "dbBckMke", "dbBckDel", "dbBckRes", "mMde", "upView", "upRev", "upMke", "massView", "massPrp", "massSnd", "fPwdCh", "bugRp") //Maintence tab
  47. );
  48.  
  49. static public function bmask2Arr($arr) {
  50. $out = array();
  51. foreach($arr as $key => $val) {
  52. if($val != "" && !is_array($val)) { //You cant use empty() here bcs $val can be (int) 0
  53. $out[$key] = self::decodeBitmask($val, self::$bitmaskRights[$key]);
  54. }
  55. }
  56.  
  57. return $out;
  58. }
  59.  
  60. static public function arr2bmask($arr) { //Translates array to bitmask
  61. $out = array();
  62. foreach($arr as $key => $val) {
  63. if(!empty($arr["news"])&&is_array($arr["news"]))
  64. $out[$key] = self::encodeBitmask($val, self::$bitmaskRights[$key]);
  65. }
  66. return $out;
  67. }
  68.  
  69. static public function convertRightsArr($groupsData) { //Convert 1-dimissional array of rights to standard format ready to use with arr2bmask() method, for exsample look info adminPanel class, method saveGroup() and ajax.groups.php file (js code, static public function saveGroup())
  70. $trTable = array(); //For translate table geenration
  71. reset($groupsData);
  72.  
  73. foreach(self::$bitmaskRights as $module => $perms) {
  74. $tmp = &$trTable[$module];
  75. foreach(self::$bitmaskRights[$module] as $pname) {
  76. $value = each($groupsData);
  77. if($value === false) return false; //'each()' reach end of data last time but there are more avaible keys to fill in $bitmaskRights, so data is invalid [incomplate]
  78. $tmp[$pname] = $value["value"];
  79. }
  80. }
  81.  
  82. return $trTable;
  83. }
  84. ?>


Co prawda burdelasty ale wiadomo o co chodzi smile.gif
U mnie tabela uprawnień wygląda tak:


Gdybyś potrzbował jakiś objaśnień do kodu wal śmiało - tu lub na GG/PW.
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.