Uncategorized

SharePoint におけるコードからのアクセス権限の制御 (Tips)

環境:
Office SharePoint Server (MOSS) 2007
Visual Studio 2005 


こんにちは。


今日は、SharePoint ワークフローにおけるドキュメントのアクセス権の制御について、簡単なサンプルコードをご紹介します。


ワークフローなどで、「承認ワークフロー実行中は編集させたくない」とか、「承認されるまで関係者以外見えないようにしたい」 などといった処理は現実の業務アプリでは必ず必要になってくることでしょう。
今日は、Visual Studio による SharePoint ワークフローで、このような制御をおこなう方法について記載します。


概念は特筆すべきことはありません。要は、ワークフローアイテム(そのワークフローを起動したSharePoint上のリスト項目やドキュメントなどのアイテム)を取得し、プログラムコードから変えてしまえば良いわけです。SharePoint では、こういう場合には、オブジェクトモデル (Microsoft.SharePoint) の SPRoleAssignment を使用します。
例えば、onWorkflowActivated アクティビティの Invoke メソッドに以下の通り記載するとします。


private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
    workflowId = workflowProperties.WorkflowId;


    this.workflowProperties.Item.BreakRoleInheritance(false);


    Contact workflowOriginator = Contact.FromPrincipal(this.workflowProperties.OriginatorUser);
    SPRoleAssignment ownerRoleAssignment = new SPRoleAssignment(
        workflowOriginator.LoginName,
        workflowOriginator.EmailAddress,
        workflowOriginator.DisplayName,
        “”);
    ownerRoleAssignment.RoleDefinitionBindings.Add(this.workflowProperties.Web.RoleDefinitions.GetByType(SPRoleType.Reader));


    this.workflowProperties.Item.RoleAssignments.Add(ownerRoleAssignment);
}


まず、いったん現状の権限の継承関係を解除するため、BreakRoleInheritance メソッドを呼び出しておきます。そしてその後で、必要な権限のみ設定をおこないます。上記は作成者にだけしか権限付与をしていませんが、現実のシナリオでは、Replicator アクティビティ (WF のアクティビティ) などを使って複数へのアサインを可能にしておき、このアサインされた複数名のみに権限を付与する、などといったシナリオが考えられるでしょう。


上記の例では、ロールタイプとして、SPRoleType.Reader を付与していますので、このワークフローを開始すると、作成者からは下図のように、編集系の機能 (例えば、「Microsoft Office Word で編集」メニュー、など) がいっさいなくなっているのがわかります。(但し、管理者に対してはこのロール設定が有効にならないので注意してください。)



また、作成者以外のユーザにはいっさいのロールを付与していないため、作成者以外のユーザがこのドキュメントライブラリをみると、そもそもドキュメント (上図の場合 「比較用のドキュメント2」) 自体が表示されなくなります。


尚、元に戻すには ResetRoleInheritance メソッドを使用します。(2007/07/11 念のため追記)


コードからの権限制御については、こうしたもの以外にもさまざまなシナリオが考えられます。
例えば、プログラムコードは、通常、それを起動しているユーザの権限で実行されていますから、上記とは逆に、コードから実行する場合のみ権限をゆるくしたいというケースも考えられます (例えば、管理者でないと取得できない情報の一部を使って処理したい場合、など)。このケースについては、お馴染みの Ted Pattison さん (MVP の方) が、以下の Visual How To の中でデモも含めてご紹介してくれていますので参考になることでしょう。


http://msdn2.microsoft.com/en-us/library/bb466220.aspx


 

Categories: Uncategorized

Tagged as: ,

Leave a Reply