a autorización de @Delphi DataSnap no respeta el atributo TRoleAuth

Estoy tratando de implementar la autorización en una aplicación Delphi XE DataSnap. Desglosé esto en un ejemplo muy simple, pero aún no veo los efectos del atributo TRoleAuth para un método o clase.

Here es una clase DSServerMethods simple que incluye los métodos de muestra generados. La clase ha sido decorada con los roles invitados y cualquier persona autorizada, y el rol negado no deseado. El método ReverseString se ha decorado con el rol de solo lectura denegado:

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;

Estoy asignando roles en el método OnUserAuthenticate. Por ejemplo, tengo un usuario para el que estoy asignando la función de solo lectura de OnUserAuthenticate, una función que creo que debería negarle a ese usuario permiso para ejecutar la función ReverseString.

De lo que entiendo, mi código debe comparar los roles del usuario con EventObject.AuthorizedRoles y EventObject.DeniedRoles TStrings del método OnUserAuthorize del TDSAuthenticationManager, y establecer el parámetro formal válido de este método en consecuencia.

Aquí hay un método simple de OnUserAuthorize que estoy usando para probar. Cuando entro usando el depurador en respuesta a un usuario con el rol de solo lectura que intenta invocar ReverseString, EventObject.AuthorizedRoles y EventObject.DeniedRoles son nulos, y EventObject.Roles contiene el rol de solo lectura.

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;

¿Me estoy perdiendo el punto, o hay una propiedad que necesito establecer en algún lugar para permitir que el atributo TRoleAuth funcione?

= = = = = = = = = = Editar: Mat DeLong proporcionó la respuesta. La unidad DSAuth (donde se declara la clase de atributo personalizado TRoleAuth) faltaba en la sección de interfaz de la unidad en la que se definió el descendiente DSServerModule.

Respuestas a la pregunta(1)

Su respuesta a la pregunta