我正在尝试在 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 后代的单元的接口部分中丢失。