2009-01-21 80 views
3

我正在編寫一個GUI應用程序,它將具有用戶登錄功能。每個用戶將屬於(至少一個,可能多於一個)組,每個組將具有指示某些權限是否被允許或不允許的屬性。權限列表將涵蓋諸如編輯過去的事物,打印,刪除數據等等。許多不同的動作可以由相同的權利來處理(例如,可以從菜單和工具欄中啓動打印)。如何在GUI應用程序中實現安全性?

我的問題是:什麼是實施這個安全系統的最佳方式?每個動作都應該有布爾isSecurable屬性和權限列表嗎?應該如何進行檢查,通過中央結構進行檢查,還是每項檢查都應該檢查自己所需的權利?

我在這裏的目標是正確的。我知道我可以快速地將一個工作系統拼湊在一起,但我希望有一些不會導致問題的事情。對於詳細的解釋,我很抱歉,但我甚至不知道該怎麼稱呼我正在尋找的東西。

編輯:這不是真的GUI特定的,我想,但我已經研究了很多關於這方面的信息,我發現的大部分內容都是針對Web應用程序或一般的「安全編程」技巧。

回答

3

「BCS」是正確的,因爲安全檢查不應該綁在GUI,應與基礎動作/操作/你調用方法。在MVC框架中,模型或其他地方可以在模型調用的動作中使用該框架。

如果你的行爲的調度肯定會通過一些常見的機構(例如所有共享一個特定的基類),然後把安全檢查有以涵蓋所有的基礎的好辦法。

一個額外的想法:您描述爲組可能或可能不是安全術語中的「角色」。

+0

你將如何處理諸如「查看用戶權利」之類的權利?如果用戶不被允許查看用戶權限,則該對話框甚至不應該打開。對話框是否應嘗試打開安全設置,並在失敗時顯示錯誤消息? – 2009-01-21 23:06:52

1

我會像一個MVC系統,並沒有把任何安全的東西放在GUI代碼。使它成爲模型的一部分,以便它不會如何觸發用戶觸發操作,同一個安全代碼路徑會運行。

我從來沒有做過太多的GUI甚至不太安全的東西,但一個方法是有跟蹤是誰登錄並僅轉發被允許在目前情況下請求的安全代理對象。

如果你想有一個有趣的項目,該代理對象將是生成的代碼一個很好的候選人:

考慮到與安全註解的接口,生成實現該接口和塊/轉發呼叫基於一類傳遞給它的安全上下文。

1

如果您要編寫.NET應用程序,則可以考慮使用成員資格提供程序基礎結構。您甚至可以使用此方法爲Web客戶端和桌面客戶端實現身份驗證,如this MSDN magazine article中所述。

+0

安全規則#1:不要自己扮演角色。 – BCS 2009-01-21 23:01:58

0

你的問題聽起來像狀態模式。用戶所屬的每個組是不同的狀態對象。將每個適用的狀態對象附加給用戶。然後,當用戶試圖做一些需要權利的事情時,詢問狀態對象。

因爲用戶可以在多個組,你也可能會受益於修飾模式。

0

我知道這是一箇舊帖子,但想提供我的解決方案。這可能不是最好的方式,但它適用於我,可能對某人有用。

我在Delphi編寫應用程序的7

管理員數據庫應用程序(Windows GUI和MySQL),可以創建具有不同級別的訪問權限的用戶。該應用程序管理工廠生產(原材料),產品,銷售&服務,以及在3個國家設有工廠和辦事處的公司的會計。

用戶可以根據其安全權限訪問選項卡,表格和功能。

基本上,某些功能根據權限被禁用或隱藏。在某些情況下,我會向用戶顯示一條消息,其他時候,如果他們的權限不足,他們的行爲將被忽略。每個用戶可以擁有單一權限或權限組合。

例如,某人可能有;

  • 「只讀銷售&服務」「讀/寫生產」
  • 「讀/寫銷售&服務」
  • 或者,任何或所有的任意組合可用權利。

它的工作原理是這樣的;

unit bitwise; // Found this unit on stackoverflow - All credit to original author 

    interface 

    Const // Added constants that suit me 

     Adm = 01; // Administrator 
     Rws = 02; // Read Write Sales 
     Ros = 04; // Read Only Sale 
     Rwp = 08; // Read Write Production 
     Rop = 16; // Read Only Production 
     roa = 32; // Read Only All 
     acc = 64; // Accounting 

    function IsBitSet(const val: byte; const TheBit: Byte): Boolean; 
    function BitOn(const val: byte; const TheBit: Byte): byte; 
    function BitOff(const val: byte; const TheBit: Byte): byte; 
    function BitToggle(const val: byte; const TheBit: Byte): byte; 

    implementation 

    function IsBitSet(const val: byte; const TheBit: Byte): Boolean; 
    begin 
     Result := (val and (TheBit)) <> 0; 
    end; 

    function BitOn(const val: byte; const TheBit: Byte): byte; 
    begin 
     Result := val or (TheBit); 
    end; 

    function BitOff(const val: byte; const TheBit: Byte): byte; 
    begin 
     Result := val and not (TheBit); 
    end; 

    function BitToggle(const val: byte; const TheBit: Byte): byte; 
    begin 
     Result := val xor (TheBit); 
    end; 

     end. // End of Unit 

如果我要當用戶嘗試的東西,他們沒有獲得,我使用下面的函數顯示一條消息。

Function TForm1.HasRights(Need: Byte; Msg: String;): Boolean; 
Begin 

    If Not IsBitSet(rights, Need) Then 
    Begin 
    showdialog('Security', 'You have insufficient Security Rights!', 'You must have ' + 
     Msg + ' access to perform the action you have attempted.', '', '', false, False, True); 
    Result := False; 
    End 
    Else 
    Result := True; 

End; 

我稱這樣上面的函數;

If HasRights(Rop Or Rwp Or Adm, '"Read Only Production" or "Read/Write Production"') Then 
Begin 

    // Do something they are allowed to do 

End // else ignore them 

如果我不需要一個消息框,顯示我打電話IsBitSet這樣;

If IsBitSet(rights, Adm) Then 
    Begin 
     // Do stuff 
    end; 

只是爲了清晰,這裏是ShowDialog的功能。它顯示我創建的自定義窗體,非常適合我的應用程序。

Function TForm1.showdialog(Const DialogTitle: WideString; Const FirstCaption: WideString; 
    Const SecondCaption: widestring; Const ConfirmBCaption: widestring; Const CancelBCaption: 
    widestring; LeftButton, RightButton, MiddleButton: Boolean): boolean; 
Var 
    whattheysaid: boolean; 
    craigsdialog: Tcraigsdialog; 
Begin 

    // Modal1Button and Modal2Button can have modified captions whereas Modal3Button 
    // is always "Ok". If the only button a user needs is "Ok" then make it visible 
    // and receive a modalresult of 3 when clicked. This 3rd button is for appearance 
    // only and just makes it a bit neater. 

    Whattheysaid := False; 
    Craigsdialog := Tcraigsdialog.Create(nil); 
    With Craigsdialog Do 
    Begin 

    // Set the Dialog details as required 

    Caption := DialogTitle; 
    Label1.Caption := FirstCaption; 
    Label2.Caption := SecondCaption; 

    Modal1Button.Visible := leftbutton; 
    Modal2Button.Visible := rightbutton; 
    Modal3Button.Visible := Middlebutton; 

    modal1button.Caption := ConfirmBCaption; 
    modal2button.Caption := CancelBCaption; 

    Case ShowModal Of 
     1: whattheysaid := True 
     2: whattheysaid := False 
     3: whattheysaid := True 
    End; 
    End; 
    FreeAndNil(craigsdialog); 
    Result := whattheysaid; 
End; 

正如我在咆哮中所說的那樣,這可能有用也可能沒有用,但它對我來說非常有用。

相關問題