加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi DataSnap授权不会检查TRoleAuth属性

发布时间:2020-12-15 04:16:48 所属栏目:大数据 来源:网络整理
导读:我正在尝试在Delphi XE DataSnap应用程序中实现授权.我将其分解为一个非常简单的示例,但仍然没有看到TRoleAuth属性对方法或类的影响. 这是一个简单的DSServerMethods类,它包含生成的示例方法.该课程已经装饰了客人和任何授权角色,以及不受欢迎的拒绝角色. Re
我正在尝试在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中分配readonly角色,我相信该角色应该拒绝用户执行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属性起作用?

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

解决方法

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

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

有几点需要注意:

>如果在函数或过程上放置了一个TRoleAuth属性,它将替换放在该类上的属性(仅适用于该方法.)它不会添加它.
>如果设置最终应用于方法的设计时属性(通过修改TDSAuthenticationManager组件上的’Roles’集合),则将忽略您在代码中添加的属性.

希望有所帮助,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读