Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> system uprawnień - koncepcja
japolak
post
Post #1





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 11.03.2007
Skąd: Łódzkie

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


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?
Go to the top of the page
+Quote Post
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.

Ten post edytował mortus 31.05.2011, 21:59:26
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Jeśli masz alergię na wyszukiwarkę, to daj sobie spokój: http://php.pl/Wortal/Artykuly/Proces-tworz...L-Jak-korzystac
Go to the top of the page
+Quote Post
kiler129
post
Post #4





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


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 (IMG:style_emoticons/default/smile.gif)
U mnie tabela uprawnień wygląda tak:
(IMG:http://wstaw.org/m/2011/06/01/Screen_shot_2011-06-01_at_17.22.08.png)

Gdybyś potrzbował jakiś objaśnień do kodu wal śmiało - tu lub na GG/PW.

Ten post edytował kiler129 1.06.2011, 16:23:33
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.12.2025 - 23:12