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