PHP專案許可權設定

五嶽之巔發表於2011-10-28

    以前開發的系統都是中小型系統,而且面向的多是業務固定的企業。因此,以前自己設計的許可權管理都是通過一張二維表表示的:


  1. id _in _read _write _dump _backup
  2. 1001 1    1    0    0     0
  3. 1002  0    0    0    0     0
  4. 1003  1    1     1    1     0

    於是,一個小型矩陣就出現了,配合資料庫MySql中的相關欄位:

  1. id name gender    acl     email
  2. 1001 張三     男   11000   ok@ok.com
    再寫一個readAcl類,每次根據具體的值得出相應的許可權。這是小打小鬧而已,因為:
    1、資料大量冗餘
    當資料多的時候,就是說系統使用人數多的時候,或者部門業務較多,表中列就有二三十行的情況下,就會產生浪費,引發資料庫反映變慢,究其原因在於這種方式太精細化了,可以控制每個人的每個活動。其實不需要這麼設定,因為很多人只有幾個專案有許可權,別的許可權相就都是0,如果真的發生了那樣的事情,呵呵,我們們看到的表會是一個處處是0,幾乎都看不見1的一個大表格。這不是浪費是什麼。
    2、可擴充套件性差
    資料冗餘就說明了,此處需要改進,而且那麼多重複資料,第一眼看去就想給他物件導向進行拆分進行重用,呵呵,可惜那是資料庫,雖不能物件導向,但可以拆表。其實,大家可以設想一下,如果這個公司業務發展情況良好,不久又兼併了一個新業務,那麼我們就得在這個大表中再新增添一個列,又出現N多個0和極少量的1。如果說這你可以容忍,那麼每次都對這個表增加列你還能容忍麼?增加列之後,人員資料表裡的acl欄位值你就必須每次都重寫一遍,因為之前是11000(五位),現在所有人都變為110000(六位),如果還有別的表也用到這個值呢?別忘了,你還得對PHP程式進行修改呢。
    總之,你說麻煩不麻煩。


    我靠,那怎麼辦?
    是的,我也發愁ing。突然我想到了Linux,這可是可以一機帶超多個使用者的系統,它的許可權設計是按組來分的。靈感告訴我,這是個好點子。於是我檢視了Discuz和Joomla的使用者許可權設定,思路都是一樣:按組分配許可權。
    萬歲,首先還是那張使用者表,可以固定欄位羅
  1. id name gender    group    email
  2. 1001 張三     男      0     ok@ok.com
    這張表裡變得更簡單了,就一個數,代表組ID。
    接著設定組許可權表:
  1. id _in _read _write _dump _backup
  2. 0 1    1    1    1     1
  3.  0    0    0    0     0
  4.  1    1     0    1     0

    如果遇到需要新增業務的話,直接對組許可權表增加列即可,並不影響別的表。

    接下來就是一個簡單的組員表了。
  1. gid id
  2. 0 1001
  3. 0 1003
  4. 1 1129
  5. …………

    這種做法在遇到超大量資料時都沒有問題。關鍵是極好地解決了許可權分配問題。其實看起來是種樹狀結構:
  1. groupA:
  2. 張三
  3. 李四
  4. groupB:
  5. 王五
  6. 趙六
  7. 陳七
  8. groupC:
  9. 周八
      這一點,就寫到這吧。





相關文章