Авторизация Delphi DataSnap не поддерживает атрибут TRoleAuth - PullRequest
5 голосов
/ 18 марта 2011

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

1 Ответ

10 голосов
/ 18 марта 2011

Следует убедиться в том, что в вашем классе методов сервера у вас есть модуль «DSAuth» в разделе использования раздела интерфейса. Если вы этого не сделаете, вы должны увидеть предупреждение во время компиляции с надписью «Неподдерживаемая языковая функция:« пользовательский атрибут »». Если это происходит, это означает, что ваши атрибуты игнорируются, потому что тип TRoleAuth неизвестен.

Если это не так, то я не уверен, что еще это будет. При правильной работе в событии OnUserAuthorize вы должны увидеть «EventObject.DeniedRoles», содержащий роль «только для чтения», определенную в атрибуте кода. Вы также должны увидеть «EventObject.UserRoles», содержащий эту роль. Если это так, то вам вообще не нужно было бы реализовывать OnUserAuthorize, и код автоматически отклонял бы эту авторизацию пользователя.

Пара вещей на заметку:

  • Если вы помещаете атрибут TRoleAuth в функцию или процедуру, он заменяет атрибут, помещенный в класс (только для этого одного метода.) Он не добавляет к нему.

  • Если вы установите атрибут времени разработки, который в итоге будет применяться к методу (путем изменения коллекции «Роли» в компоненте TDSAuthenticationManager), то атрибуты, добавленные вами в код, будут игнорироваться.

Надеюсь, это поможет,

Mat

...