5

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 の子孫が定義されたユニットのインターフェイス セクションにありませんでした。

4

1 に答える 1

10

確認すべきことの 1 つは、サーバー メソッド クラスのインターフェイス セクションの uses 句に「DSAuth」ユニットがあることです。そうしないと、「サポートされていない言語機能: 'カスタム属性'」というコンパイル時の警告が表示されます。これが発生している場合は、TRoleAuth タイプが不明であるため、属性が無視されていることを意味します。

そうでない場合、他に何が起こるかわかりません。正常に動作している場合、OnUserAuthorize イベントに、code 属性で定義された「読み取り専用」ロールを含む「EventObject.DeniedRoles」が表示されます。このロールを含む「EventObject.UserRoles」も表示されます。この場合、OnUserAuthorize を実装する必要はまったくなく、コードはこのユーザー認証を自動的に拒否します。

注意すべき点がいくつかあります。

  • 関数またはプロシージャに TRoleAuth 属性を配置すると、クラスに配置された属性が置き換えられます (その 1 つのメソッドのみ)。追加はされません。

  • 最終的にメソッドに適用される設計時属性を設定すると (TDSAuthenticationManager コンポーネントの「Roles」コレクションを変更することによって)、コードに追加した属性は無視されます。

それが役立つことを願って、

マット

于 2011-03-18T18:51:58.400 に答える