トップ回答者
JavaScript で 権限を削除。

質問
-
SharePoint Online のユーザーの、アクセス権限変更の「JavaScript」を作成中です。
自分の考えとしては、自分の現在の権限が「フルコントロール」
↓
権限を一度削除(remove)
↓
観覧権限を追加(add)
を考えて作成しました。。
window.onload = function() { /*---------------------------------------------------------------------------*/ // 変数宣言 /*---------------------------------------------------------------------------*/ // リスト名 var listName = "test"; // コンテキストの取得 var clientContext = new SP.ClientContext; // 現在のログインユーザーの取得 var oUser = clientContext.get_web().get_currentUser(); // 対象リストの取得 var oList = clientContext.get_web().get_lists().getByTitle(listName); // 対象アイテム選択 var itemId = 1; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ alert("a"); // アイテム情報取得 var oListItem = oList.getItemById(itemId); alert(1); // リストを固有の権限に設定し既存権限をすべてクリア oListItem.breakRoleInheritance(false, false); alert(2); // // ロールバインディング削除 // var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.deleteObject(clientContext); var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.remove(clientContext); alert(3); // ロールバインディング作成 collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(clientContext); alert(4); // 閲覧アクセス許可レベルの追加 collRoleDefinitionBinding.add(clientContext.get_web().get_roleDefinitions().getByType(SP.RoleType.reader)); alert(5); // ユーザーをバインド oListItem.get_roleAssignments().add(oUser, collRoleDefinitionBinding); // ユーザー情報読込 clientContext.load(oUser); // アイテム情報読込 clientContext.load(oListItem, "Title"); // 実行 -- アラートにて表示 -- clientContext.executeQueryAsync(function(){ alert("次のアイテムに固有の権限を設定しました :\n" + oListItem.get_item("Title") + "\n\n" + "新たに次のユーザーに権限を付与しました :\n" + _spPageContextInfo.userLoginName); }, onQueryFailed); }; /*---------------------------------------------------------------------------*/ // 失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQueryFailed(sender, args) { alert("Request failed. " + args.get_message() + "\n" + args.get_stackTrace()); }
しかし、デバック用のアラートは"2"で止まり、Google ChromeのF12を使いエラーを見ているのですが、
var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.remove(clientContext);
removeの所がエラーになります。
エラーメッセージ:SP.RoleDefinitionBindingCollection.remove is not a function
翻訳:関数ではありません。とエラーになります。
どなたか分かる方いれば、教えて頂ければと思います。
- 編集済み mie.8 2017年7月12日 6:13 。
回答
-
前回の続きですね。oListItem.breakRoleInheritance(false, false); にすると、最初の引数 false により、カレントのユーザーに対してフルコントロールが付与されます。下記MSDNに記述があります。そうでないと削除した時点で、ユーザーからアクセス権限の変更権限まではく奪されるので、自然な流れだと思います。
以前の質問では、私が見落としていたのが "カレントユーザー" にこだわっている点でした。カレントユーザーでなければ、当該ユーザーに閲覧権限だけを付与することになり想定に近い挙動になっていたはずです。むろん、カレントユーザーにも権限は付与されるのですが。
ロールバインディングの削除のところはロジックが問題で、それではエラーになると思います。
書き方を根本から見直して、下記のサンプルコードを参考にしてみてください。
function ChangeUserPermissions() { // コンテキストオブジェクトの生成 var clientContext = new SP.ClientContext; // 対象リストオブジェクトの取得 var oList = clientContext.get_web().get_lists().getByTitle("test"); // 対象となるアイテムのID var itemId = 1; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ this.oListItem = oList.getItemById(itemId); //目的のアイテムの取得 oListItem.breakRoleInheritance(false,false);//固有の権限に変更
this.oUser = clientContext.get_web().get_currentUser(); //カレントユーザーの権限をいったん削除 oListItem.get_roleAssignments().getByPrincipal(oUser).deleteObject();
var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(clientContext); collRoleDefinitionBinding.add(clientContext.get_web().get_roleDefinitions().getByType(SP.RoleType.reader)); oListItem.get_roleAssignments().add(oUser, collRoleDefinitionBinding); clientContext.load(oListItem,'Title'); clientContext.executeQueryAsync(onQuerySucceeded, onQueryFailed); } /*---------------------------------------------------------------------------*/ // 成功・失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQuerySucceeded(sender, args) { alert('次のアイテムに固有の権限を設定しました : ' + oListItem.get_item('Title') + ' 新たに次のユーザーに権限を付与しました : ' + _spPageContextInfo.userLoginName); } function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); }
- 編集済み Ai Hirano (Microsoft MVP)MVP 2017年7月12日 7:33
- 回答としてマーク mie.8 2017年7月12日 8:25
すべての返信
-
前回の続きですね。oListItem.breakRoleInheritance(false, false); にすると、最初の引数 false により、カレントのユーザーに対してフルコントロールが付与されます。下記MSDNに記述があります。そうでないと削除した時点で、ユーザーからアクセス権限の変更権限まではく奪されるので、自然な流れだと思います。
以前の質問では、私が見落としていたのが "カレントユーザー" にこだわっている点でした。カレントユーザーでなければ、当該ユーザーに閲覧権限だけを付与することになり想定に近い挙動になっていたはずです。むろん、カレントユーザーにも権限は付与されるのですが。
ロールバインディングの削除のところはロジックが問題で、それではエラーになると思います。
書き方を根本から見直して、下記のサンプルコードを参考にしてみてください。
function ChangeUserPermissions() { // コンテキストオブジェクトの生成 var clientContext = new SP.ClientContext; // 対象リストオブジェクトの取得 var oList = clientContext.get_web().get_lists().getByTitle("test"); // 対象となるアイテムのID var itemId = 1; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ this.oListItem = oList.getItemById(itemId); //目的のアイテムの取得 oListItem.breakRoleInheritance(false,false);//固有の権限に変更
this.oUser = clientContext.get_web().get_currentUser(); //カレントユーザーの権限をいったん削除 oListItem.get_roleAssignments().getByPrincipal(oUser).deleteObject();
var collRoleDefinitionBinding = SP.RoleDefinitionBindingCollection.newObject(clientContext); collRoleDefinitionBinding.add(clientContext.get_web().get_roleDefinitions().getByType(SP.RoleType.reader)); oListItem.get_roleAssignments().add(oUser, collRoleDefinitionBinding); clientContext.load(oListItem,'Title'); clientContext.executeQueryAsync(onQuerySucceeded, onQueryFailed); } /*---------------------------------------------------------------------------*/ // 成功・失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQuerySucceeded(sender, args) { alert('次のアイテムに固有の権限を設定しました : ' + oListItem.get_item('Title') + ' 新たに次のユーザーに権限を付与しました : ' + _spPageContextInfo.userLoginName); } function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); }
- 編集済み Ai Hirano (Microsoft MVP)MVP 2017年7月12日 7:33
- 回答としてマーク mie.8 2017年7月12日 8:25