第三部分,權限設計和acl插件的使用。感覺這樣的權限設計也是很主流的。
下面,再看看EOL.ORG在權限設計方面是如何實現的,或者使用了什麼插件。
用戶角色設計和權限管理
EOL.org的權限部分采用acl_system plugin的插件,地址如下
http://brainspl.at/articles/2006/02/20/new-plugin-acl_system
機制如下:
用戶可以分配零個或多個角色
一個或多個Controller可以隸屬於一個角色
那麼,保證權限正確限制,可以從以下幾個方面實現:
1. 保證用戶必須登錄才能訪問特定的action或contoller。那麼只需要添加如下語句在controller的開始:
Ruby代碼
before_filter :check_authentication
這段檢查並不是角色有關的檢查,只是簡單的提供登錄限制。
2. 實現特定的用戶訪問特定的controller。那麼需要在指定的controller,添加
Ruby代碼
access_control :DEFAULT => 'ROLE NAME GOES HERE'
這一個檢查,將針對用戶的角色(即分配給user的role)來限制controller的讀取。如果,想了解很進一步的有關機制,可以查閱我們使用的plugin(acl_system2)的README說明文檔。那裡的例子還不錯。
3. 項目還提供很方便的controller/helper 方法用來檢查user是否隸屬於某一特定角色或者角色群。("is_user_in_role?"
)
Ruby代碼
do_this_method_only_for_admins if is_user_in_role?('Administrator')
4. 項目本身也支持對頁面的某一特定的代碼段或頁面功能段,進行權限設定。這需要調用acl 插件的helper方法對該代碼段添加基於用戶權限的修飾。例如:
Html代碼
<% restrict_to "(Administrator) & !blacklist" do %> admin stuff here <% end %>
管理功能的實現
管理功能是在用戶權限設計的基礎上,增加一個管理功能:
1.所有管理功能的controller都在administrator目錄下創建。管理權限的第一次限制
Ruby代碼
Administrator::NewContollerName
2. 對於的功能將從生成的Controller下派生
Ruby代碼
class Administrator::NewContollerName < AdminController
3. 相對應的試圖頁面在administrator目錄下 "views/administrator",
Ruby代碼
views/administrator/new_controller_name
4. 根據需要,在適當的時候,可以添加新的管理角色
5. 在管理頁面的controller最開始增加限制
Ruby代碼
access_control :DEFAULT => 'ROLE NAME GOES HERE'
這將用於保證只有擁有管理角色的用戶才能訪問administrator目錄下的controller
6. 通過在管理界面的導航欄添加菜單,以便增加到新controller的連接。修改如下文件
Ruby代碼
"views/admin/_navigation.html.erb"
則所有頁面導航的連接,將直接受到上一步我們設置的限制。
7.保證至少有一個用戶有控制和登錄管理界面的權限。不能刪除最後的管理用戶,否則系統將沒有管理功能。
日志系統設計
日志的功能通過類似數據采集系統的方式實現。在config/database.yml文件中,定義的獨立的數據庫,用來保持所有的日志信息。對Models的日志和對於用戶行為操作的記錄,被分為兩類數據表 dimension和facts。鑒於效率和數據大小的考慮,項目中數據庫沒有進行更多的授權訪問設置。在產品模式下,將會有嚴格的保護措施,以便不會誤刪數據。可是在開發模式,就有很多對應的開發和模擬數據方法,如下:
Ruby代碼
rake logging:clear # Deletes all logging-related records. (特別注意: prodution 模式不能執行) rake logging:dimension:mock THOUSANDS=2 # 創建 2,000 隨機模擬日志數據 rake logging:geocode:all # Performs geocoding on the primary data, using caches where possible. rake logging:fact:all # Derives secondary data from primary data.
或者這時也可以通過一句命令實現以上操作
Ruby代碼
script/runner script/logging_mock
項目同樣支持cron的定時操作,對特定時間區間進行日志操作,如下:
Ruby代碼
rake logging:fact:today rake logging:fact:yesterday rake logging:fact:range FROM='01/15/2007' TO='12/19/2008'