トップ回答者
【JavaScript】SharePoint Online の権限変更

質問
-
SharePoint Online の、権限変更を"JavaScript"を利用し行いたいと考えております。
【ネットを参考に、作成した権限変更のJavaScript】
/*#######################################################################################################################################*/ // 権限変更 /*#######################################################################################################################################*/ function breakSecurityInheritanceChangeUser() { /*---------------------------------------------------------------------------*/ // 変数宣言 /*---------------------------------------------------------------------------*/ // 対象サイト取得 var siteUrl = "対象サイトURL"; // ログインしているユーザー情報取得 var value = SP.Web.ensureUser(logonName); // SharePoint Online Login var clientContext = new SP.ClientContext(siteUrl); // 対象リスト選択 var oList = clientContext.get_web().get_lists().getByTitle("test"); // 対象アイテム選択 var itemId = 1; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ this.oListItem = oList.get_items().getById(itemId); oListItem.breakRoleInheritance(true); this.oUser = clientContext.get_web().get_siteUsers().getByLoginName(value); 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(oUser); clientContext.load(oListItem); clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } /*---------------------------------------------------------------------------*/ // 成功・失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQuerySucceeded(sender, args) { alert('Role inheritance broken for item ' + this.oListItem.get_item('Title') + ' and new role assignment for ' + this.oUser.get_loginName()); } function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); }
いずれは、「編集・観覧・登録」等に変更したいです。
今回は、『観覧のみ』に変更したいです。
まず、ユーザーの権限情報が取得出来ません。
// ログインしているユーザー情報取得 var value = SP.Web.ensureUser(logonName);
どなたか分かる方いらっしゃいましたら、よろしくお願い致します。
回答
-
undefined 。すでに固有の権限になっているところで試しているとか? 継承してから検証してくださいね。
**追記**
breakRoleInheritance の戻り値を期待して undefined と言っているなら、仕様です。下記に記載されています。
https://msdn.microsoft.com/ja-jp/library/office/jj245497.aspx*******
いずれにしても、記載されているコードは、ユーザー取得との部分などもあまりすっきりしていないので、下記のコードでどうでしょう? こちらの SharePoint Online 環境では動作確認済みです。
function breakSecurityInheritanceChangeUser() {
//リスト名 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; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ oListItem = oList.getItemById(itemId); oListItem.breakRoleInheritance(false,false);//リストを固有の権限に設定し既存権限をすべてクリア //ロールバインディング 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(oUser); clientContext.load(oListItem,'Title'); clientContext.executeQueryAsync(function(){ alert('次のアイテムに固有の権限を設定しました : ' + oListItem.get_item('Title') + "//" + ' 新たに次のユーザーに権限を付与しました : ' + _spPageContextInfo.userLoginName); }, onQueryFailed); } /*---------------------------------------------------------------------------*/ // 失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); }
それから、collRoleDefinitionBinding.add... の下りですが、戻り値は undefined です。勝手に予測せずまずは資料をあたりましょう。
https://msdn.microsoft.com/en-us/library/office/jj245132.aspx
- 編集済み Ai Hirano (Microsoft MVP)MVP 2017年7月5日 8:43
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年7月7日 6:00
- 回答としてマーク mie.8 2017年7月12日 2:27
すべての返信
-
ぱっと見ですが、
var value = clientContext.get_web().ensureUser(logonName);
ではないですか?
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年7月7日 6:00
-
ソースコードにいろいろと課題がありますね。
ログインユーザーは下記のコードで取得できます。SP.Webオブジェクトからカレントのユーザー情報できるので。
this.oUser = clientContext.get_web().get_currentUser();
あと、次のところも次のように修正できます。
this.oListItem = oList.get_items().getById(itemId);
↓
this.oListItem = oList.getItemById(itemId);
あと、ロールを取得するところはロール名は小文字です。そして観覧ではなく、閲覧アクセス許可レベルですね。
collRoleDefinitionBinding.add(clientContext.get_web().get_roleDefinitions().getByType(SP.RoleType.Reader));
↓
collRoleDefinitionBinding.add(clientContext.get_web().get_roleDefinitions().getByType(SP.RoleType.reader));
また、下記のところも既存ユーザーにすでに明示的に権限が付与されていれば必要ですが、そうでない場合はエラーになりますね。
oListItem.get_roleAssignments().getByPrincipal(oUser).deleteObject();
ご自身がサイトコレクションの管理者などであれば、次のようにアクセス権限を固有にしていったん既存権限をクリアしてユーザー追加するところから始めた方がよいように思います。
oListItem.breakRoleInheritance(false,false);
以上、参考になれば。
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年7月7日 6:00
-
ありがとうございます。
ご指摘頂いた箇所を参考にさせて頂きました。
/*#######################################################################################################################################*/ // 権限変更 /*#######################################################################################################################################*/ function breakSecurityInheritanceChangeUser() { /*---------------------------------------------------------------------------*/ // 変数宣言 /*---------------------------------------------------------------------------*/ // 対象サイト取得 var siteUrl = "対象サイト"; // SharePoint Online Login var clientContext = new SP.ClientContext(siteUrl); // ログイン名 var from = _spPageContextInfo.userLoginName; // this.oUser = clientContext.get_web().get_currentUser(); // 対象リスト選択 var oList = clientContext.get_web().get_lists().getByTitle("test"); // 対象アイテム選択 var itemId = 1; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ this.oListItem = oList.getItemById(itemId); // oListItem.breakRoleInheritance(true); // 元 oListItem.breakRoleInheritance(false,false); // 修正 this.oUser = clientContext.get_web().get_siteUsers().getByLoginName(from); // 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(oUser); clientContext.load(oListItem); clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } /*---------------------------------------------------------------------------*/ // 成功・失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQuerySucceeded(sender, args) { alert('Role inheritance broken for item ' + this.oListItem.get_item('ffff') + ' and new role assignment for ' + this.oUser.get_loginName()); } function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); }
デバックコンソールで上記コードを1行ずつ実行して行くと、
oListItem.breakRoleInheritance(false,false);
部分で、「undefined」になってしまいます。
この関数は、ユーザーが保持しているアクセス権限をクリア(初期化)する、という意味合いでよろしいでしょうか?
クリアされるため、「undefined」が返って来るという認識で合っておりますでしょうか?
また、
collRoleDefinitionBinding.add(clientContext.get_web().get_roleDefinitions().getByType(SP.RoleType.reader));
を実行しても「undefined」が返って来ます。
自分のイメージ(予想)では、"add"で権限を追加しているので
「RoleType:reader」みたいな結果が返って来ると思っておりまして・・・
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年7月7日 6:00
- 回答の候補の設定解除 栗下 望Microsoft employee, Moderator 2017年7月7日 6:01
-
undefined 。すでに固有の権限になっているところで試しているとか? 継承してから検証してくださいね。
**追記**
breakRoleInheritance の戻り値を期待して undefined と言っているなら、仕様です。下記に記載されています。
https://msdn.microsoft.com/ja-jp/library/office/jj245497.aspx*******
いずれにしても、記載されているコードは、ユーザー取得との部分などもあまりすっきりしていないので、下記のコードでどうでしょう? こちらの SharePoint Online 環境では動作確認済みです。
function breakSecurityInheritanceChangeUser() {
//リスト名 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; /*---------------------------------------------------------------------------*/ // 処理 /*---------------------------------------------------------------------------*/ oListItem = oList.getItemById(itemId); oListItem.breakRoleInheritance(false,false);//リストを固有の権限に設定し既存権限をすべてクリア //ロールバインディング 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(oUser); clientContext.load(oListItem,'Title'); clientContext.executeQueryAsync(function(){ alert('次のアイテムに固有の権限を設定しました : ' + oListItem.get_item('Title') + "//" + ' 新たに次のユーザーに権限を付与しました : ' + _spPageContextInfo.userLoginName); }, onQueryFailed); } /*---------------------------------------------------------------------------*/ // 失敗時のメッセージ /*---------------------------------------------------------------------------*/ function onQueryFailed(sender, args) { alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); }
それから、collRoleDefinitionBinding.add... の下りですが、戻り値は undefined です。勝手に予測せずまずは資料をあたりましょう。
https://msdn.microsoft.com/en-us/library/office/jj245132.aspx
- 編集済み Ai Hirano (Microsoft MVP)MVP 2017年7月5日 8:43
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年7月7日 6:00
- 回答としてマーク mie.8 2017年7月12日 2:27
-
追記・サンプルコードを作成して頂きまして、ありがとうございます。
そちらのサイトも見たのですが、開発経験も浅く、サイトの内容も全然理解出来ておりませんでした。
実行結果の「undefined」と、サイトに記載されている、戻り値:undefined
は、そのような意味だったのですね。理解致しました。
頂いたコードを、IEのデバックコンソールで実行した所アラート表示されました。
*対象アイテム名、対象ユーザー共に、合っております。
しかし、「testリスト」の【test_list】を操作してみると、編集出来てしまいます。
自分の認識では、実行後のユーザーは権限が『閲覧アクセス許可レベル』に変わっているので
"アイテムを表示"する事は出来ても、『アイテムの編集 から 登録は出来ない』と思っていたのですが
自分の考え(認識)が間違えておりますでしょうか?
- 編集済み mie.8 2017年7月5日 9:45 訂正
-
閲覧アクセス許可レベルに関する考え方は、あっています。
とはいえ、SharePoint特有のアクセス権限の考え方の基本からしっかりと学ばれた方がよいかもしれませんね。もしかしたらサイトコレクションの管理者なのかなと思います。サイトコレクションの管理者はアクセス権限にかかわらずすべてのサイトコレクション内のアイテムに対する全ての操作ができます。
拙書の「ひと目でわかる SharePoint Server 2016」などでも基本的な考え方はせつめいしていますのでご参考まで。
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年7月7日 6:00