Como compor uma filtragem de segurança link em um modelo de exibição?[resolvido]
-
10-12-2019 - |
Pergunta
No antigo ListView/DataForm XSL com base webpart você poderia jogar para baixo alguns XSLT, o que tornaria um link se a visualização de usuário com privilégios suficientes, como por exemplo:
<xsl:choose>
<xsl:when test="ddwrt:IfHasRights(16)">
<div>
<div style="float:right;">
<a href="{$RootSiteUrl}/{$dvt_adminurl}" class="ms-rteElement-arrowLink">Manage</a>
</div>
<span class="clear"></span>
</div>
</xsl:when>
</xsl:choose>
A minha pergunta é como compor uma filtragem de segurança e vincular o novo modelo de exibição ambiente?
Solução
Então, o que eu acabei fazendo é criar um controle de usuário que é referenciado na minha página principal;esse controle derruba alguns campos ocultos que compor acesso que o usuário atual tem.Posso, então, usar os que estão escondidos sinalizadores no meu modelo de exibição para mostrar/ocultar a condicional de conteúdo.Um ponto chave é a utilização de ClientIDMode="Static"
desde que você não pode garantir que a jQuery é carregado quando o modelo de exibição presta.
Código Asp:
<span id="uinfo" style="display:none;">
<asp:HiddenField ID="HdnIsAnonymous" runat="server" Value="1" ClientIDMode="Static" />
<asp:HiddenField ID="HdnIsSteAdm" runat="server" Value="-1" ClientIDMode="Static" />
<asp:HiddenField ID="HdnMgCurWeb" runat="server" Value="-1" ClientIDMode="Static" />
<asp:HiddenField ID="HdnContrCurWeb" runat="server" Value="-1" ClientIDMode="Static" />
</span>
Code-behind:
string siteUrl = SPContext.Current.Site.Url;
string webUrl = SPContext.Current.Web.Url;
bool isAnonymous = SPContext.Current.Web.CurrentUser == null;
if (!isAnonymous && !SharePointHelper.IsCurrentPageInEditMode)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(webUrl))
{
// Check the current web and verify if the current user can manage the web and or contribute pages.
using (SPWeb elevatedCurrentWeb = elevatedSite.OpenWeb())
{
HdnMgCurWeb.Value = elevatedCurrentWeb.DoesUserHavePermissions(SPBasePermissions.ManageWeb) ? "1" : "0";
SPList pagesList = elevatedCurrentWeb.Lists.TryGetList("Pages");
if (pagesList != null)
{
HdnContrCurWeb.Value = pagesList.DoesUserHavePermissions(SPBasePermissions.EditListItems) ? "1" : "0";
}
}
}
}
HdnIsSteAdm.Value = (SPContext.Current.Web.CurrentUser.IsSiteAdmin ? "1" : "0");
}
HdnIsAnonymous.Value = (isAnonymous ? "1" : "0");
Modelo De Exibição De Código:
<!--#_
var canEdit = false;
var canEditFlagElem = $get("HdnContrCurWeb");
if (canEditFlagElem)
{
canEdit = canEditFlagElem.value == "1";
}
_#-->
...
<!--#_ if(canEdit) { _#-->
<div style="text-align:right;margin-right:12px;">
<span class="link-item"><a>Security trimmed link</a>
</div>
<!--#_ } _#-->
Concedido, um usuário mal-intencionado poderia encontrar o local do link no modelo de exibição código e carregá-lo, mas ele realmente não é um problema, porque de segurança do SharePoint irá tirar de lá.
Isto é superior para a emissão de JSOM SP.js chamadas IMHO, que requerem um mínimo de dois retornos de chamada depois que a página for carregada para verificar as permissões, dados que é processado através do controle também é informação genérica que pode ser utilizada por todos os modelos de apresentação na página, e é a melhor opção em termos de desempenho e diminuição de pedidos.