+1 Хорошо, эта роль - игрушка, с которой я хочу немного поиграть в следующие месяцы, и добро пожаловать в SO, @Mat. :)

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

Из того, что я понимаю, мой код должен сравнивать роли пользователя с TStrings EventObject.AuthorizedRoles и EventObject.DeniedRoles из метода 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)

Ваш ответ на вопрос