Delphi XE DataSnap アプリケーションで承認を実装しようとしています。これを非常に単純な例に分解しましたが、メソッドまたはクラスの TRoleAuth 属性の効果はまだわかりません。
生成されたサンプル メソッドを含む単純な DSServerMethods クラスを次に示します。クラスは、guest および any の許可された役割と、歓迎されない拒否された役割で装飾されています。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 関数を実行するユーザーのアクセス許可を拒否する必要があると考えています。
私が理解していることから、私のコードは、ユーザーの役割を TDSAuthenticationManager の OnUserAuthorize メソッドからの EventObject.AuthorizedRoles および EventObject.DeniedRoles TStrings と比較し、それに応じてこのメソッドの有効な仮パラメーターを設定する必要があります。
これは、テストに使用している簡単な 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 属性を機能させるためにどこかに設定する必要があるプロパティがありますか?
= = = = = = = = = = 編集: Mat DeLong が回答を提供しました。DSAuth ユニット (TRoleAuth カスタム属性クラスが宣言されている場所) が、DSServerModule の子孫が定義されたユニットのインターフェイス セクションにありませんでした。