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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top