Авторизация Delphi DataSnap не уважает атрибут TRoleAuth

Я пытаюсь реализовать авторизацию в приложении Delphi XE 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.

Насколько я понимаю, мой код должен сравнивать роли пользователя с EventObject. AuthorizedRoles и EventObject.DeniedRoles TStrings из метода OnUserAuthorize TDSAuthenticationManager и соответствующим образом установите допустимый формальный параметр этого метода.

Вот простой метод 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 работал?

= = = = = = = = = =

Вот простой метод 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 работал?

= = = = = = = = = =

Вот простой метод 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 функционировал?

= = = = = = = = = = Изменить: Мэт ДеЛонг дал ответ. Модуль DSAuth (где объявлен класс настраиваемого атрибута TRoleAuth) отсутствовал в разделе интерфейса модуля, в котором был определен потомок DSServerModule.

5
задан Cary Jensen 18 March 2011 в 19:46
поделиться