【问题标题】:Delphi DataSnap authorization not repecting TRoleAuth attributeDelphi DataSnap 授权不尊重 TRoleAuth 属性
【发布时间】:2011-07-18 07:25:49
【问题描述】:

我正在尝试在 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 TStrings 进行比较,并相应地设置此方法的有效形​​式参数。

这是我用于测试的简单 OnUserAuthorize 方法。当我使用调试器进入它以响应具有只读角色的用户尝试调用 ReverseString 时,EventObject.AuthorizedRoles 和 EventObject.DeniedRoles 都为零,并且 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 属性?

= = = = = = = = = = 编辑:Mat DeLong 提供了答案。 DSAuth 单元(其中声明了 TRoleAuth 自定义属性类)在定义 DSServerModule 后代的单元的接口部分中丢失。

【问题讨论】:

    标签: delphi authorization delphi-xe datasnap


    【解决方案1】:

    要确保的一件事是,在您的服务器方法类中,接口部分的使用子句中有“DSAuth”单元。如果不这样做,您应该会看到一条编译时警告,上面写着“不支持的语言功能:‘自定义属性’”。如果发生这种情况,则意味着您的属性将被忽略,因为 TRoleAuth 类型未知。

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

    需要注意的几点:

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

    希望对你有帮助,

    垫子

    【讨论】:

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