2011-03-18 49 views
5

我想在Delphi XE DataSnap應用程序中實現授權。我把它分解成一個非常簡單的例子,但是仍然沒有看到方法或類的TRoleAuth屬性的影響。Delphi DataSnap授權不重複TRoleAuth屬性

這是一個簡單的DSServerMethods類,它包含生成的示例方法。該課程已與客人和任何授權角色,不受歡迎的拒絕角色裝飾。該ReverseString方法已被裝飾只讀否認角色:

type 
    [TRoleAuth('guest,anyone','unwelcome')] 
    TMyDSServerMethods = class(TDSServerModule) 
    DataSetProvider1: TDataSetProvider; 
    ... 
    public 
    { Public declarations } 
    function EchoString(Value: string): string; 
    [TRoleAuth('','readonly')] 
    function ReverseString(Value: string): string; 
    ... 
    end; 

我分配在OnUserAuthenticate方法的角色。例如,我有一個用戶,我從OnUserAuthenticate分配只讀角色,我相信這個角色應該拒絕用戶執行ReverseString函數的權限。

根據我的理解,我的代碼應該將用戶的角色與TDSAuthenticationManager的OnUserAuthorize方法中的EventObject.AuthorizedRoles和EventObject.DeniedRoles TStrings進行比較,並相應地設置此方法的有效形​​式參數。

這是我用於測試的一個簡單的OnUserAuthorize方法。當我使用調試器響應具有隻讀角色的用戶來嘗試調用ReverseString時,EventObject.AuthorizedRoles和EventObject.DeniedRoles都是nil,並且EventObject.Roles包含只讀角色。

procedure TServerContainer1.DSAuthenticationManager1UserAuthorize(
    Sender: TObject; EventObject: TDSAuthorizeEventObject; 
    var valid: Boolean); 
begin 
    outputdebugstring(PChar(Eventobject.UserName)); 
    if EventObject.UserRoles <> nil then 
    outputdebugstring(PChar(eventobject.UserRoles.Text)); 
    if EventObject.AuthorizedRoles <> nil then 
    outputdebugstring(PChar(eventobject.AuthorizedRoles.Text)); 
    if EventObject.DeniedRoles <> nil then 
    outputdebugstring(PChar(eventobject.DeniedRoles.Text)); 
    valid := True; 
end; 

我是否錯過了一點,或者是否有我需要設置某處以使TRoleAuth屬性可以正常工作的屬性?

= = 編輯:馬德龍提供了答案。 DSAuth單元(其中聲明瞭TRoleAuth自定義屬性類)在定義了DSServerModule後代的單元的接口部分中缺失。

回答

10

需要確定的一件事是,在服務器方法類中,在接口部分的uses子句中有「DSAuth」單元。如果你不這樣做,你應該看到一個編譯時間警告,說「不支持的語言特性:'自定義屬性'」。如果發生這種情況,這意味着您的屬性被忽略,因爲TRoleAuth類型是未知的。

如果情況並非如此,那麼我不確定它會是什麼。如果工作正常,在OnUserAuthorize事件中,您應該看到「EventObject.DeniedRoles」包含代碼屬性中定義的「只讀」角色。你還應該看到包含這個角色的「EventObject.UserRoles」。如果是這種情況,那麼你根本不需要實現OnUserAuthorize,代碼會自動拒絕這個用戶授權。

幾件事情要注意:

  • 如果你把TRoleAuth屬性上的函數或過程,它取代戴上階級屬性它不添加(只適用於一種方法。)到它。

  • 如果您設置了最終適用於該方法的設計時屬性(通過修改TDSAuthenticationManager組件上的「角色」集合),那麼您在代碼中添加的屬性將被忽略。

希望幫助,

+2

嗨,歡迎SO。 – 2011-03-18 18:58:30

+0

「不支持的語言功能」? Delphi編譯器用默默無語的語言:) – mjn 2011-03-18 19:14:03

+1

Bingo! DSAuth單元未出現在DSServerModule的接口(或實現部分)使用子句中。只要我把它放在TRoleAuth屬性中,它就完成了它的工作。 – 2011-03-18 19:42:27