Delphi DataSnap授权不重复TRoleAuth属性

Delphi DataSnap授权不重复TRoleAuth属性,delphi,authorization,delphi-xe,datasnap,Delphi,Authorization,Delphi Xe,Datasnap,我试图在Delphi XE DataSnap应用程序中实现授权。我将其分解为一个非常简单的示例,但仍然没有看到TRoleAuth属性对方法或类的影响 下面是一个简单的DSServerMethods类,其中包括生成的示例方法。课堂上布置了来宾和任何授权角色,以及不受欢迎的拒绝角色。ReverseString方法已使用readonly denied角色修饰: type [TRoleAuth('guest,anyone','unwelcome')] TMyDSServerMethods = c

我试图在Delphi XE DataSnap应用程序中实现授权。我将其分解为一个非常简单的示例,但仍然没有看到TRoleAuth属性对方法或类的影响

下面是一个简单的DSServerMethods类,其中包括生成的示例方法。课堂上布置了来宾和任何授权角色,以及不受欢迎的拒绝角色。ReverseString方法已使用readonly denied角色修饰:

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 tString进行比较,并相应地设置此方法的有效形式参数

下面是一个简单的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;
过程TServerContainer1.dsAuthenticationManager1用户授权(
发送方:ToObject;事件对象:TDSAuthorizeEventObject;
var有效值:布尔值);
开始
outputdebugstring(PChar(Eventobject.UserName));
如果EventObject.UserRoles为零,则
outputdebugstring(PChar(eventobject.UserRoles.Text));
如果EventObject.AuthorizedRoles为零,则
outputdebugstring(PChar(eventobject.AuthorizedRoles.Text));
如果EventObject.DeniedRoles为零,则
outputdebugstring(PChar(eventobject.DeniedRoles.Text));
有效:=真;
结束;
我是否遗漏了要点,或者是否需要在某个地方设置属性以启用TRoleAuth属性的功能

=======
编辑:Mat DeLong提供了答案。定义DSServerModule子体的单元的接口部分中缺少DSAuth单元(其中声明了TRoleAuth自定义属性类)

需要确保的一件事是,在server methods类中,interface部分的uses子句中有“DSAuth”单元。如果不支持,您应该会看到编译时警告:“不支持的语言功能:'自定义属性'”。如果发生这种情况,则表示您的属性将被忽略,因为TRoleAuth类型未知

如果不是这样的话,那么我不确定还会是什么。如果工作正常,在OnUserAuthorize事件中,应该会看到“EventObject.DeniedRoles”,其中包含在code属性中定义的“readonly”角色。您还应该看到包含此角色的“EventObject.UserRoles”。如果是这种情况,则根本不需要实现OnUserAuthorize,代码将自动拒绝此用户授权

有几件事需要注意:

  • 如果将TRoleAuth属性放在函数或过程上,它将替换放在类上的属性(仅针对该方法)。它不会添加到该类中

  • 如果设置了最终应用于方法的设计时属性(通过修改TDSAuthenticationManager组件上的“角色”集合),则将忽略在代码中添加的属性

希望有帮助


Mat

“不支持的语言功能”?Delphi编译器用晦涩的语言说话:)宾果!DSAuth单元未出现在DSServerModule的接口(或实现部分)uses子句中。只要我把它放进TRoleAuth属性中,它就完成了它的工作。@mjn:Delphi的编译器消息通常都非常清晰易懂。这是为数不多的例外。什么是更好的信息?警告:您的属性已从编译代码中删除,因为您需要以某种方式启用此可选属性功能?我不确定添加DSAuth如何启用这些属性。其中一定有某种“pragma”定义了这个特定属性,并允许它在没有警告的情况下编译?+1很好,这个角色auth是我想在接下来的几个月里玩一玩的玩具,欢迎使用它,@Mat.)