一個朋友留言,提了一些關心的問題,這里說說自己的想法(不一定對)。
問題:數據范圍的控制:“事實上不是每個用戶都可以看到所有記錄的。以財務管理為例,部門經理只能查看金額小于1W的數據;而總經理則沒有限制”。象這樣要根據數據的某個字段對數據范圍進行控制,應該實現呢,是通過AOP動態改變執行的SQL嗎?這樣似乎不太可行,如果要執行的SQL特別復雜,那動態改變SQL 就更難了?,F在的應用中一般使用hibernate,這樣的話就變成了動態改變HQL,也是難的。
回答:目前在我的代碼里就是通過AOP動態改變執行的SQL,改變HQL確實很困難,但是改變criteria就比較簡單了。對于特別復雜的sql,我的建議是把這些SQL直接寫到你的業務程序里去,或者單獨配置出來,和ibatis比較類似。
問題:單條數據ACL權限:由于數據是不斷增加的,所以要對單條數據的ACL權限,不應該是數據已存在,然后再對存在的數據授權,應該是對某種規則進行授權。以你舉的個人通訊錄為例,各人自己維護自己的通訊記錄,數據只對自己可見,要想實現對自己的數據的可再授權,應該是對符合某個規則的數據進行授權,也就是說 “要執行授權操作的人就是數據的擁有者”這是個規則,那是不是應該對這個規則授權呢。
回答:我理解的和你不一樣。我的理解是這樣的,實際中我把單條數據的權限劃分為擁有、瀏覽、修改、刪除四種權限,用戶擁有哪種權限就可以對數據進行相應哪種操作。“要執行授權操作的人就是數據的擁有者”也可以理解為“要執行授權操作的人就必須有該數據的擁有權限”,這可以理解為一種規則,但我更愿意把它理解為一種習慣,很顯然對習慣授權是沒有意義的。當然這里是存在規則的,這種規則簡單的說是這樣:當我新增一條數據時,哪些人對該條數據擁有擁有的權限,哪些人對該條數據擁有瀏覽的權限,哪些人對該條數據擁有修改的權限,哪些人對該條數據擁有刪除的權限。權限相關記錄會在新增這條數據時根據該規則生成。在上面的例子里,這一規則體現在:各人自己維護自己的通訊記錄,數據只對自己可見。也就是說在用戶新增自己的通訊記錄時,系統同時往權限表里插入了該用戶對該記錄的一個擁有權限記錄。
問題:數據字段權限:要實現對某個字段的權限控制,那是不是應該所有字段應該有個默認的操作呢,或者默認就是只可以查看,要進行修改的話就必須授權。但是通常整個應用中的字段非常多,這樣是乎不太合理。那是不是可以做成所有字段默認就是可以CRUD的,只有要控制的字段才進行權限判斷。同樣,由于使用 Hibernate來進行持久化,那對字段的控制是不是就變成了對類中屬性的控制。
回答:數據字段權限一直是一個很難辦的事情,實際上我很傾向于把這個問題推到頁面來解決。其實所有的權限控制最后都是要通過頁面來表現的。其實對字段來說,所需要的權限也很簡單:可見/不可見,只讀/可修改。這樣的話,通過標簽的形式來控制字段的顯示、只讀就顯得很自然。對字段的權限記錄可以放入到數據庫,或者xml中,與具體的pojo類沒有關系,當渲染頁面的時候,由標簽來讀取相關權限記錄并控制顯示。
問題:角色權限的繼承:角色權限的繼承通過規則來做,這個規則應該怎么設計呢。
回答:這個問題其實是一個分離關注點的問題。你可以抽象出一個規則接口,這個接口定義了對部門、角色下的用戶而言,哪些權限是可以從部門角色繼承的,繼承幾級,哪些是不可以的。然后再具體實現。更靈活的方式是定義出一個配置文件,運行時可以靈活修改。
http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
posted on 2007-06-05 17:36
ronghao 閱讀(4068)
評論(3) 編輯 收藏 所屬分類:
權限相關