我想在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後代的單元的接口部分中缺失。
嗨,歡迎SO。 – 2011-03-18 18:58:30
「不支持的語言功能」? Delphi編譯器用默默無語的語言:) – mjn 2011-03-18 19:14:03
Bingo! DSAuth單元未出現在DSServerModule的接口(或實現部分)使用子句中。只要我把它放在TRoleAuth屬性中,它就完成了它的工作。 – 2011-03-18 19:42:27