none
JavaScript で 権限を削除。 RRS feed

  • 質問

  • 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
    2017年7月12日 2:34

回答

  • 前回の続きですね。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()); }






    2017年7月12日 7:26

すべての返信

  • 前回の続きですね。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()); }






    2017年7月12日 7:26
  • お世話になっております。

    はい、前回の続きでございます。

    ロジックまでは、分からなかったです。

    「 .deleteObject() 」で削除するんですね。

    いつもサンプルコードも付けて頂き、大変助かっております。


    無事、希望動作が出来ました。

    沢山ご支援ありがとうございました。

    2017年7月12日 8:35