前回の[Dynamics CRM] フィールドレベルセキュリティの一実装 Retrieve メッセージ編 に続いて、エンティティレコードの作製 Create メッセージに対してフィールドレベルセキュリティを実装してみます。
フィールドレベルセキュリティーにつていは、 下記リンクの Dynamics CRM 4.0 における、フィールドレベルセキュリティのホワイトペーパーを参考にしています。
Security and Authentication in Microsoft Dynamics CRM: Field-level Security in Microsoft Dynamics CRM: Options and Constraints
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=471f8670-47b3-4525-b25d-c11a6774615c
対象は取引先企業エンティティとし、次の機能を提供します。
- 作成する取引先企業にメールアドレスが設定して作成できなくする。項目に存在する場合、メールアドレスを除去する
- 売上高50000以上の取引先企業を作成する場合は例外(InvalidPluginExecutionException)をスローする
動作確認環境
- Dynamics CRM 4.0 Update Rollup 8
- .NET 3.5, Visual Studio 2008
.NET3.0 以上で使用されるusing を除去すれば、.NET 2.0 でも動作すると思います。
1. 実装方針
1.1 プラグインによる実装
フィールドレベルのセキュリティはプラグイン(サーバ側)で実装します。javascript などクライアント側で項目を非表示、マスクなどをして権限外の処理を行わせないようにすることも有用ですが、Webサービスから作成することもできるので、プラグインとして実装する必要があります。
1.2 実装ステージ
Pre Stage で項目の内容をチェックしてフィールドレベルセキュリティを実装します。
2サンプル実装
Create メッセージの Pre Stage において、メールアドレスが含まれる場合は除去し、売上高が50000以上の場合は例外を発生させています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.Sdk.Query;
using System.Xml;
using System.Xml.Linq;
namespace FieldlevelSecurityPlugin
{
/// <summary>
/// 作成 (Createメッセージ)に対するフィールドレベルの
/// セキュリティ設定の実装例
///
/// </summary>
public class FieldLevelPlugin : IPlugin
{
#region IPlugin メンバ
/// <summary>
/// プラグインのエントリ
/// </summary>
/// <param name="context"></param>
public void Execute(IPluginExecutionContext context)
{
if (context.CallerOrigin is ApplicationOrigin)
{
if (context.MessageName.Equals(MessageName.Create))
{
if (context.Stage == 10)
{
CheckInCreatePreStage(context);
}
}
}
}
#endregion
#region Create メッセージ
/// <summary>
/// 売上高が50000以上の企業を登録するとエラー
/// emailaddress1を登録できなくする
/// </summary>
/// <param name="context"></param>
public void CheckInCreatePreStage(IPluginExecutionContext context)
{
if (context.PrimaryEntityName == Microsoft.Crm.SdkTypeProxy.EntityName.account.ToString())
{
DynamicEntity entity = context.InputParameters[ParameterName.Target] as DynamicEntity;
if (entity.Properties.Contains("emailaddress1"))
{
// メールアドレスが存在すれば除去
entity.Properties.Remove("emailaddress1");
}
if (entity.Properties.Contains("revenue"))
{
CrmMoney m = entity.Properties["revenue"] as CrmMoney;
if (!m.IsNull && m.Value > 50000)
{
throw new InvalidPluginExecutionException("この企業を登録する権限がありません");
}
}
}
}
#endregion
}
}
売上高が50000以上を設定して取引先企業を作成しようとした場合、次のようのエラーメッセージが画面に表示されるようになります。
3. Create メッセージにたいするField Level Security のまとめ
サンプル実装では、Pre Stage で対象とする項目があればセキュリティを適用するようにしています。
説明は以上です。誤り、指摘点などありましたらご連絡ください。