2012-02-07 42 views
1

首先,我非常抱歉這個問題有多長,並感謝您閱讀它的時間!使用mySQL的三層web應用程序權限結構

我們目前正在開發我喜歡描述的基於Web的平臺,該平臺包含許多應用程序,並且遇到了權限問題。這是我們業務的內部應用程序,並未公開,因此我們有獨特的需求。

我們不能使用嚴格的基於組的權限系統,因爲它太籠統了,使得它太嚴格了,有些員工需要訪問應用程序中的多個應用程序,多個部門(有些可能稱爲他們組)每個部門。

我們還需要能夠動態顯示數據,因爲我們正在爲我們需要能夠在數據庫中註冊信息的平臺開發許多應用程序,它將填充相應的複選框並檢查它們是否爲如果用戶無權訪問應用程序,部門或功能,則用戶可以訪問或保留它們。

出於這些原因,我們需要3層爲包括

  1. 的應用程序權限的用戶可以訪問
  2. 部門的用戶可以訪問
  3. 特定功能的用戶訪問

從理論上講,這應該非常簡單,我相信最好的解決方案其實很簡單,但我認爲我們要麼忽視某些東西,要麼看得太緊ING。

我去任何進一步之前,據我所知,有許多的方式來處理這種情況在IT現有的結構,我們有6個運行,但是這些工作正常使用的「不尋常」的方法,我們真的做需要更好的解決方案,我相信這始於數據庫設計。

目前,我們已經嘗試具有以下表有關權限

應用寄存器中的3臺系統:這個擁有該平臺內的所有應用程序的列表

app_id (primary AI) | perm_id (int) | app_name | app_code | app_location | tab_location | access_key 

應用程序權限註冊:這包含每個應用程序的每個許可列表,不管它是應用程序,部門還是功能(在下面的access_type下定義)

permission_id (primary AI) | perm_id (int) | app_id | permission_code | permission_name | permission_description | access_type 

特定的用戶權限:此認爲涉及到的應用程序,部門和功能的具體權限

permission_id (primary AI) | perm_id (varchar) | app_permission_id | app_id | user_id | access_status | function_code 

問題與分配權限就會出現,當我們靜下心來,功能水平,我們發現mySQL查詢需要過於具體以便獲取用戶訪問信息,並且我們無法獲得該部門的完整功能列表,因此012xx中沒有NULL值返回,他們應該在這裏返回值 - 這歸因於具有通用名稱的特殊字段n多個表被連接,但每個表中的數據不同。我們指定了我們希望從每個查詢返回的所有字段,但出於某種原因,這個1字段不斷出現,並且錯誤的數據正在被連接。

所以,我想實現以下結構:

應用寄存器:將與一個URI和導航系統參考

app_id (primary AI) | app_name | app_uri | app_tab 

部門登記註冊的所有應用程序的列表:列舉所有部門及與申請的關係

dept_id (primary AI) | app_id | dept_name 

功能寄存器:持有的所有功能列表和一個部門的關係,在「部門登記」的部門涉及到應用程序

function_id (primary AI) | dept_id | function_name | function_description 

特定的用戶權限:持有名單的用戶可以執行所有的功能,這被關聯到功能寄存器,即贊同到部門寄存器,該涉及所述應用註冊

permission_id (primary AI) | user_id (index) | function_id | permission_status (int - 0 = not allowed access | 1 = allowed access) 

編輯開始

我剛剛意識到,如上所示,特定用戶權限表上的內容並不完全正確,我沒有考慮到應用程序或部門權限,因此這是怎麼回事?

我已將function_id更改爲permit_item以保存該項目的ID,然後將其添加到permit_type以定義它是否爲用戶有權訪問的應用程序,部門或功能。

permission_id (primary AI) | user_id (index) | permit_item | permit_type | permission_status (int - 0 = not allowed access | 1 = allowed access) 

編輯結束

從這裏我們可以做一些聯接在查詢中,例如(只是爲了顯示插圖的概念而已,我知道這是不正確的查詢或把它寫在製作)

SELECT * FROM app_register 
    JOIN dept_register ON app.register.app_id=dept_register.app_id 
    JOIN function_register ON dept_register.dept_id=function_register.dept_id 
    JOIN user_permissions ON app_register.app_id=user_permissions.app_id 
    WHERE user_permissions.user_id='1' 

這應該給我說,涉及所有職能,部門和應用程序,然後簡化加入權限表最好的方式列出哪些應用程序的用戶訪問。

但是我需要公正的觀察者的意見,而不是情緒投資的數據庫設計師和他的朋友。

有什麼我忽視或看得太辛苦了嗎?

是否有另一個更好的結構,我們可以嘗試,你可以想到處理這些數據?

我真的很感謝大家的幫助,對於這個問題的長度再次抱歉!

回答

0

您提出的解決方案似乎對我最有意義。

關於你的問題LEFT JOIN奇怪地工作,我可能會建議我們使用一種簡單的技術。我們只需在每個表格及其字段前添加一個唯一值。例如,表:

蘋果:[ID,品牌,有機] 品牌:[ID,名稱]

將成爲:

app_apples:[APP_ID,appbrd_brand,app_organic] brd_brands: [brd_id,brd_name]

這實現了兩件事。每個字段保證在整個系統中都是唯一的(因此應該解決所有問題),並且數據之間的關係也可以很快看到和解決。

只是我的兩分錢。

+0

感謝您的2美分和小費@Donnie,這個提示非常有意義,現在讓我們來看看我可以如何侮辱數據庫設計師!呵呵 – Ryan 2012-02-07 14:19:41