2011-03-18 47 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