Può capitare, ad esempio nello sviluppo di una WebPart, che si abbia la necessità di inserire dei dati all’interno di una lista SharePoint senza che l’utente che sta eseguendo la WebPart abbia alcun diritto su quella lista.
Con SharePoint 2007 abbiamo a disposizione il comando RunWithElevatedPrivileges che ci permette di eseguire del codice con l’identità dell’utente SHAREPOINT\System account, tuttavia, oltre a tutte le considerazioni in materia di sicurezza dobbiamo prendere alcuni accorgimenti per far funzionare il nostro codice:
· Dopo aver elvevato i privilegi dovremmo istanziare nuovamente le classi SPSite ed SPWeb senza poter utilizzare quelle disponibili nel context in quanto quelle sono create nel context dell’utente corrente.
· E’ necessario impostare a true le proprietà AllowUnsafeUpdates altrimenti saremo in grado di leggere i dati dalla lista, ma non saremmo comunque in grado di aggiornarli.
· E’ preferibile utilizzare gli statements using per le classi SPSite ed SPWeb istanziate per essere sicuri che il metodo Dispose sia sempre chiamato.
· Siccome l’utente che esegue l’operazione è un utente di sistema, perderemo l’informazione dell’utente che ha effettuato l’operazione; è quindi buona norma memorizzare l’utente corrente prima di elevare i privilegi e memorizzarlo in un’apposito campo all’interno della lista.
Il codice che ne deriva è il seguente:
SPSite site = SPControl.GetContextWeb(this.Context).Site;
SPWeb web = SPControl.GetContextWeb(this.Context);
SPUser curUser = web.AllUsers[System.Security.Principal.WindowsIdentity.GetCurrent().Name];
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(site.ID))
{
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(web.ID))
{
if (elevatedWeb != null)
{
elevatedSite.AllowUnsafeUpdates = true;
elevatedWeb.AllowUnsafeUpdates = true;
SPList list = elevatedWeb.Lists["Mia Lista"];
if (list != null)
{
SPListItem item = list.Items.Add();
item["Titolo"] = "Risposta di " + curUser.Name;
item["Utente Corrente"] = curUser;
item.Update();
}
}
}
}
});
|
Technorati Tags:
SharePoint,
.NET