我想在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后代的单元的接口部分中缺失。
嗨,欢迎SO。 – 2011-03-18 18:58:30
“不支持的语言功能”? Delphi编译器用默默无语的语言:) – mjn 2011-03-18 19:14:03
Bingo! DSAuth单元未出现在DSServerModule的接口(或实现部分)使用子句中。只要我把它放在TRoleAuth属性中,它就完成了它的工作。 – 2011-03-18 19:42:27