【IDM】Active Directory の「直属の部下」属性からマネージャーかどうかを判断する 2/2

「マネージャーかどうかを判断しよう」の第3弾です。以前の投稿は以下をご覧ください。

前回の投稿で、Active Directory の DirectReports 属性から部下の一覧を持ってきました。

でも、この部下一覧をアプリケーションにごそっと渡したところで、アプリ側は迷惑なだけです。

どうせならば「DirectReports に部下が 一人以上存在していれば Manager である」と判断することはできないものでしょうか?

できます(それも乱暴な話ではあるのですが...)。

これを実現するには、以下のような 2 つのクレームルールを作成する必要があります。

  1. directReports 属性から値を取得するためのルール(クレームは発行しません)
  2. 取り出した値が1以上ならば Role クレームに Manager を放り込んで発行

■1つ目

1つ目のルールは、前回作成したものとほとんど変わりません。どこが違うかよーく見てください。

前回のルール
c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> issue (store = "Active Directory", types = ("https://schemas.tf.com/Identity/Claims/directReports"), query = ";directReports;{0}", param = c.Value);

今回のルール
c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
=> add (store = "Active Directory", types = ("https://schemas.tf.com/Identity/Claims/directReports"), query = ";directReports;{0}", param = c.Value);

違いは、発行ステートメントとして、issue を使うか、add を使うかです。今回は、add を使っています。

両者の何が違うのか...詳しく描くと混乱を招くので興味のある方は以下をご覧ください。簡単に言ってしまうと、「外向けにクレームを発行するのが Issue で、クレームに格納するけども外には発行しないのが add 」です。つまり、add を使用すると、アプリケーションに余計なクレームを渡すことなく内部の処理だけで使用することができるのです。

add_or_issue

■2つ目

DirectReports に格納されている値が1個以上ならば....なんて判断をどうするかというと、以下のようにします。

count ( [Type == "https://schemas.tf.com/Identity/Claims/directReports"]) > 0
=> issue(Type = "https://schemas.microsoft.com/ws/2008/06/identity/claims/role", Value = "Manager");

なんと、count などという関数を使用することができるんですね。上の例では、directReports クレームに0より大きい値が入っていたら role クレームに Manager を放り込んで Issue する.. という意味になります。

実行結果例は以下の通りです。

image

こちらのほうが、アプリ側の処理もシンプルになっていいですよね。