在我的應用程序中,用戶可以執行很多不同的操作,例如, (書/庫例子只是爲了更清楚;在我的應用程序的操作更加複雜):如何將操作與安全檢查分離?
- 租一本書
- 讀一本書
- 寫一本書
- 移動本書
- 查找一本書
- ...
我的應用程序還包含了一些安全檢查是否會阻止這些操作。 這些檢查沒有直接關係的行動,但是從動作分別表示概念,如:
- 允許打開一本書或不
- 允許進行修改或不
- 不被允許看一本書的所有腦幹或不
目前,不同的動作(租賃,閱讀,...)包含這樣的代碼:
void readBook (Book &book)
{
if (!checkSecurity (book, OPENBOOK|SEEBOOK)) return;
...
}
void writeBook (Book &book)
{
if (!checkSecurity (book, MODIFYBOOK)) return;
...
}
這種方法使得以動態方式添加新類型的安全檢查變得非常困難。例如。一個動態的插件可能會增加額外的安全檢查。
我目前正在研究解決辦法是,不同的操作調用,看起來像這樣的接口:
class ISecurityChecker
{
public:
bool isReadBookAllowed() const = 0;
bool isWriteBookAllowed() const = 0;
...
};
複合類,然後實現此接口。該接口的其他實現可以添加到組合中。這樣,應用程序的插件或動態部分可以在需要時添加新的安全檢查。
這種方法也有一些缺點。主要問題是界面變得很大。我將看看我是否可以合併一些接口方法(因爲它們基本上執行相同或類似的操作),但不確定這是否可行。
任何其他替代方案來改善解耦?或者關於如何改進這種設計的建議?
是否存在像「網關」一樣的東西(或有限的一組東西):即,當用戶做某件事情時,它總是通過某種路線行事?例如,在某些應用程序中,用戶操作變爲http請求,因此可能會在查看http請求的單個choke點上應用檢查和規則。你有類似的東西嗎? – 2013-05-07 17:47:23
@Darius。該應用程序是一個大型模擬應用程序,可執行桌面上的所有內容(因爲需要進行大量數學計算才能得到所有數據)。所以沒有中央的http網關。我現在嘗試添加的是一個執行必要檢查的中央功能/類/接口/框架(但不是網關本身),但問題是我最終得到一個大矩陣(N個動作x M個可能的安全檢查)我試圖看看最好的方法是:對每個動作執行M個檢查,或者讓每個檢查都有邏輯來檢查N個動作中的每一個。 – Patrick 2013-05-08 07:33:42