【IDM】Active Directory の「直属の部下」属性からマネージャーかどうかを判断する 2/2
「マネージャーかどうかを判断しよう」の第3弾です。以前の投稿は以下をご覧ください。
前回の投稿で、Active Directory の DirectReports 属性から部下の一覧を持ってきました。
でも、この部下一覧をアプリケーションにごそっと渡したところで、アプリ側は迷惑なだけです。
どうせならば「DirectReports に部下が 一人以上存在していれば Manager である」と判断することはできないものでしょうか?
できます(それも乱暴な話ではあるのですが...)。
これを実現するには、以下のような 2 つのクレームルールを作成する必要があります。
- directReports 属性から値を取得するためのルール(クレームは発行しません)
- 取り出した値が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 を使用すると、アプリケーションに余計なクレームを渡すことなく内部の処理だけで使用することができるのです。
■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 する.. という意味になります。
実行結果例は以下の通りです。
こちらのほうが、アプリ側の処理もシンプルになっていいですよね。