認証と権限付与

提供: RAD Studio
移動先: 案内検索

DataSnap アプリケーションの開発 への移動


いくつかのサーバー メソッドを備えたサーバーをいったん作成したら、それらのメソッドを誰が呼び出せるかを制御する何らかのロジックを付け加えるとよいでしょう。それには、TDSAuthenticationManager コンポーネントの新しい機能や改良された機能を使用することができます。

まず手始めに、このコンポーネントをフォームに単にドロップし、認証マネージャとして設定します。この認証マネージャは、サーバーの構成に応じて TDSHTTPWebDispatcherTDHTTPServiceTDSTCPServerTransport のいずれかのコンポーネントで使用します。

認証マネージャには、OnUserAuthenticateOnUserAuthorize の 2 つのイベントがあります。また、Roles コレクションもあります。

OnUserAuthenticate

このイベントは、ユーザーが初めて接続しようと(メソッドを呼び出そうと)したときに呼び出され、ユーザーの名前やパスワードなどの接続情報を入力パラメータとして受け取ります。このイベントでは、入出力パラメータ valid に値を設定できます。デフォルトでは、これは True に設定されていますが、validTrueFalse のどちらに設定するかは、ユーザー情報など希望するあらゆる情報に基づいて決定できます。False に設定すると、ユーザー接続は拒否されるため、試みられた可能性のある呼び出しもすべて拒否されます。

validTrue に設定することにした場合は、渡された 'UserRoles' コレクションに値を設定することもできます。たとえば、以下のような処理を行うこともできるでしょう。

if (User = 'tom') and (Password = 'tom') then
  UserRoles.Add('admin');

これはつまり、ユーザーが正しいパスワードで 'tom' としてログインした場合は、'admin' というロールをそのユーザーに設定するということです。これらのユーザー ロールを後ほど権限付与で使用すると、OnUserAuthorize イベントを実装することは不要になります。

ロール

ロールを定義するには、いくつかの異なる方法があります。サーバー メソッド クラスのコードに TRoleAuth 属性を追加します(Datasnap.DSAuth ユニットが必要です)。この属性は、以下のように、クラス レベルでもメソッド レベルでも追加できます。

[TRoleAuth('admin')]
TServerMethods1 = class(TComponent)
public
  function EchoString(Value: string): string;
  function ReverseString(Value: string): string;
end;

または

TServerMethods1 = class(TComponent)
public
  [TRoleAuth('admin')]
  function EchoString(Value: string): string;
  function ReverseString(Value: string): string;
end;

最初の例では、'EchoString' も 'ReverseString' も、メソッドを呼び出すにはユーザーが 'admin' ロールを持っている必要があります。2 番目の例では、'EchoString' メソッドのみ 'admin' ロールが関連付けられています。なお、TRoleAuth 属性には省略可能な第 2 パラメータ("拒否されたロール" のリスト)があり、その動作はご想像のとおりです。どちらのパラメータも、ロールのコンマ区切りリストです。

また、AuthenticationManager コンポーネントの 'Roles' コレクションを使って、ロールを定義することもできます。この Roles プロパティはロール項目のコレクションで、各ロール項目には、適用先のクラスまたはメソッド、許可されたロールのリスト、拒否されたロールのリストがプロパティとして含まれています。AppliesTo には、TServerMethods1 などのクラス名を指定できます。その場合は、そのクラスのすべてのメソッドが適用先になります。また、'EchoString' などのジェネリック メソッド名を指定することもできます。その場合は、任意のサーバー クラスの 'EchoString' メソッドが適用先になります。あるいは、両方つまり 'TServerMethods1.EchoString' を指定して、特定クラスの特定メソッドを適用先にすることもできます。

これらのロールは実行時に設定することもできます(そのように選択した場合)。なお、このコレクションを実行時に変更する場合、AuthenticationManager のインスタンスを取得するには、それを使用しているコンポーネントをデータ モジュールに移行しなければならない可能性があります([DataSnap REST アプリケーションの新規作成]ウィザードでセットアップしたコンポーネントを使用している場合)。

OnUserAuthorize

OnUserAuthorize イベントは、既に認証が正常に済んでいるユーザーがサーバー メソッドを呼び出そうとするたびに呼び出されます。このイベントは実装する必要はありません。OnUserAuthenticate イベントの UserRoles リストにロールを追加する場合は、それらのロールだけを使用して、指定された任意のサーバー メソッドを呼び出す権限がユーザーにあるかどうかを判定できます。ただし、プロセスに対する管理を強化する場合(たとえば、時刻に基づいて呼び出しを許可したり拒否するなど)は、このイベントを実装できます。このイベントに渡されるのは、ユーザー名などの情報が格納されたオブジェクト、認証イベントで値を設定された UserRoles、メソッドの呼び出しを許可/拒否されたロールです。この情報(他に必要なものがあればそれも)を使用して、valid の値を TrueFalse のどちらに設定するか(メソッドの呼び出しを許可するか拒否するか)を決定できます。

関連項目