runwithElevatedPrivilegesと組み合わせてSplistItemを返す
-
09-12-2019 - |
質問
* * 明確化。 application==サイト定義直接データベースアクセスはウィンドウ * *です。 私は、コーディングリストアクセスにいくつかの新しいアプローチを利用するSharePoint用のアプリケーションを作成しました。私は私が正確な方法でデータの相互作用を制御することを可能にするような方法で物事を構築しました。
たとえば、POSTというクラスを持っています。これには、タイトル、概要などのような典型的なメタデータがあります。
POST内部は、新しい投稿の作成に使用するための事前にフォーマットされたSplistItemを返すNEWPOSTと呼ばれる静的メソッドです。
.
public static SPListItem NewPost(string Title,string Summary)
{
Posts = CoreLists.Posts();
var item = Posts.AddItem();
var item["Alias"] = SPContext.Current.Web.CurrentUser.LoginName;
return item;
}
あなたは私がコロリストと呼ばれるヘルパークラスを通してスプラストを手に入れていることに気づくでしょう
.
public static class CoreLists
{
public static SPList Posts()
{
return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts");
}
}
これはいくつかの素晴らしいクリーンなデータ方法になります。私が走っているのは、SPSecurity.RunWithElevatedPrivileges
でこれらのメソッドを呼び出すことができないというまともな方法を見つけることができないということです。
SPSecurity.RunWithElevatedPrivileges
は戻りブロックで機能できないため、新しいリスト項目を作成しようとすると、毎回失敗します。
私は私のリストを隠しているので私はこれをやっています。私は私が創造しているUIを通して彼らにアクセスすることができて欲しいです。 AdminSのみを管理し、SecurityBitsを使用してリストアイテムの作成者にのみ削除するために、システムをURLハッキングからシステムをロックしたいと思います。
そのため、システムアカウントによってすべてのリスト項目が作成され、その後、エイリアスと呼ばれるフィールドがあります。これにより、アイテムをユーザーに一致させることができます。
データアクセス層全体を再考する必要がありますか?クリーナーデータアクセスレイヤに対する欲求を絶対にリストアクセスの競合を制限するという決定は?
解決
SPContext.Current.Web
Delegateの中でSPSecurity.RunWithElevatedPrivileges
を使用しますか?
それはうまくいきません。 SPContext
でのものを取得すると、が現在ログオンしているのコンテキストを持つオブジェクトを提供します。つまり、SPContext
からのオブジェクトを使用して新しいリストエントリを作成した場合、それらは現在ログオンしているユーザーのセキュリティコンテキストで作成されます。
SharePoint \ Systemsを使用してリストエントリを作成する場合は、SPSecurity.RunWithWithElevatedPrivilegesの内側に新しいSPSite / SPWebオブジェクトを開く必要があります。
これを変更してみてください:
.
public static SPList Posts()
{
return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/Posts");
}
これに:
.
public static SPList Posts()
{
using( var s = new SPSite(SPContext.Current.Site.ID)
{
using( var w = SPSite.OpenWeb(SPContext.Current.Web.ID)
{
var postsList = w.Lists.TryGetList("Posts");
if( postsList != null )
return postsList;
else
/* do proper error handling */
}
}
}
これでPOSTS.ADDITEM()は正しく上昇したコンテキストを持つリストエントリを作成する必要があります。
他のヒント
RWEPを使用しないでください。必要ありません。
隠しリストには、アクセスに特別なコーディングが不要です。現在のユーザーがリストへのアクセス許可を持っている場合は、その他のリストに従って隠しリストにアクセスしてください。
現在のユーザーがリストへのアクセス許可を持っていない場合、そしてあなたがコードを介して更新をプロキシしたい場合は、システムアカウントを偽装する必要があります。さらに、セキュリティ境界にわたってオブジェクトを渡すべきではありません。データ層に渡すデータ転送オブジェクトの作成をお勧めします。
Vedrans Points Re UI / Securityはかなり正しいです。セキュリティシステムを書き換えている場合は、そのまま穀物に対して働いています。しかしまだセキュリティ(およびその他のSharePointの利点)を活用したい場合があるため、SharePointでアプリを構築するための mentalではありません。
SharePointベースのアーキテクチャの場合 - 公開サイトを使用してください。これはあなたに:を与えます
- リストの標準のSharePoint UI - これは管理者の「Backstage」ビューです。
- Pages Librate wite depart master page / ui - これは 'アプリケーション'インタフェースです。
デフォルト(All Authenticated Users)サイトへのビューアアクセスを取得します。'admin'ユーザーは、リストへの貢献者/明示的な権限を取得します。
Puntersは、アプリケーションインタフェース内のカスタムWebパーツ/コードを介してサイトデータにのみアクセスできます。
あなたの全体の概念は間違っています。
あなた自身のUIとセキュリティを開発している場合は、なぜSharePointを使用しているのですか?SQLを使用するのは多くのクリーナーです。
Code SharePointセキュリティでSPSecurity.RunWithElevatedPrivileges
を使用するたびに、現在のユーザーがSharePoint \ Systemとして機能し、すべてにアクセスできるため、Code SharePointセキュリティが損なわれます。
BTW SPSecurity.RunWithElevatedPrivileges
で実行するときに 'Creator'を設定できます。
.
//First store current user
SPUser currentUser = SPContext.Current.Web.CurrentUser;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.Url))
using (SPWeb targetWeb = elevatedSite.OpenWeb(webUrl))
{
//Code to get your item or to add a new one
// Replace 'System Account' with current user
item["Author"] = currentUser;
item["Editor"] = currentUser;
item.SystemUpdate();
}
});
添加:
それ以上の誤解を避けるため:SQLを使用することによって、SharePointデータベースを意味していましたが、他の異なるSQLデータベース。どうして?カスタムUI、カスタムセキュリティチェックを使用しているため、リストは隠されています(ソート、フィルタリングなどのSP OOTB機能を使用できません)、検索もオプションではありません - > SharePointを使用する利点はありません。データ保存として。