11
votes

Indexage SiteCore Sécurité des articles et restreindre les résultats de la recherche retournée

J'ai plusieurs rôles définis, chacun avec des restrictions différentes au contenu et aux éléments multimédias et j'aimerais limiter les résultats de la recherche renvoyés en fonction des droits d'accès de l'utilisateur actuellement connecté, plutôt que d'afficher le résultat et l'utilisateur. ensuite présenté avec une page "accès refusé". Certains contenus seront évidemment accessibles à extranet \ anonymes afin qu'ils soient retournés pour tous les utilisateurs, peu importe.

La sécurité suit la standard Pratiques SITECORE Un héritage de rôle (rôles au sein des rôles) sera utilisé, de sorte qu'il devra également en tenir compte.

Je ne pouvais rien voir dans le Module de fond de la base de données avancée que aiderait et j'ai examiné via le guide de recherche et d'indexation de Sitecore ( version 6.6 et Version 7 ) mais n'a pas pu trouver d'informations sur l'indexation de la sécurité appliquée aux éléments. Les articles suivants ont quelques suggestions:

  • Comment Puis-je mettre en place un indice Lucene dans Sitecore qui gère la sécurité correctement?

    Cela se sent "sale" et a le potentiel de problèmes de performance, en particulier lorsqu'il existe un grand nombre d'éléments retournés. En outre, (voir dans les commentaires) le problème avec les résultats de pagination.

    • Sécurité (AKA Autorisations) et Lucene - Comment ? Devrait-il être fait?

      Ce qui précède semble plus réaliste et filtrerait les résultats en fonction des rôles de sécurité indexée, il serait évidemment nécessaire d'élargir les rôles pour gérer les rôles au sein des rôles. Je préoccupe ici que nous aurions besoin de gérer les autorisations refusées, lorsque nous devrions avoir expressément besoin de refuser / restreindre l'accès à certains rôles aux éléments de contenu (je sais que cela n'est pas recommandé, mais il existe un besoin très spécifique de toujours nier).

      Je suis à la phase de planification pour le moment, avec la sortie de SITECORE 7 aujourd'hui, il est également possible d'utiliser les bibliothèques de Lucene mis à jour et / ou SOLR si cela facilite la vie - en supposant que certains des modules Comme WebForms pour les spécialistes du marketing et Courriel Campaign Manager est mis à jour avant trop longtemps.

      Quelles sont les solutions que les utilisateurs utilisent pour le retour des résultats de la recherche en tenant compte de la sécurité? Toute alternative que les questions liées ci-dessus? Peut-être que quelque chose dans Sitecore 7 que je puisse exploiter, les bibliothèques de Lucene mis à jour ou Solr?

      Je préférerais garder tout cela "hors de la boîte" sitecore et ne pas utiliser d'autres produits de recherche tiers si possible.


1 commentaires

Je ne l'ai fait que avec un chenleur personnalisé qui ajoute une valeur de métadonnées comme des membres Sonny: 1. Je pense que si vous aviez un champ comme Autocorisérols contenant tous les rôles autorisés à voir l'article que vous pourriez adapter votre requête de cette façon. Mais peut-être que les autorisations sont quelque chose que vous faites comme un processus postal? Je serais intéressé à voir où se passe les réponses - une grande question.


4 Réponses :


2
votes

Eh bien - vos considérations semblent tout à fait sur la cible. La mise en œuvre facile consiste à vérifier l'élément via la recherche de la base de données - mais la pagination, la facette et d'autres statistiques échoueront dans cela.

L'approche que nous faisons est d'indexer des jetons de sécurité pour les rôles - ayant un champ d'inclusion pour permettre et un champ d'exclusion pour refuser les droits. Vous devez ensuite créer une requête pour cela - et développer tous les rôles dans les rôles de la requête.

Il y a deux problèmes que vous pourriez être confrontés. L'un est très complexe ou des requêtes pour tous les rôles des rôles. Pourrait être moins bien performant. L'autre est l'indexation de la congestion - comme vous devez indexer des parties majeures des contenticides lorsque la sécurité et les autorisations changent, comme sont héritées.

L'alternative consiste à utiliser les requêtes de JOIN - mais normalement, ce serait mauvais performant.


3 commentaires

Une des options que je cherche consiste à utiliser Options de filtrage comme suggéré dans la deuxième réponse J'ai lié. Cela pourrait fonctionner mieux et plus facile à utiliser à l'aide de vos suggestions.


Je ne peux pas commenter sur Kieranties Post à cause de trop peu de réputation :-) Mais je vois toujours une question d'indexation. Lorsque vous utilisez une sécurité héritée, vous ne changerez pas de sous-sommet - mais les règles de sécurité ont changé en raison de l'héritage. Par conséquent, vous n'obtiendrez pas le sous-couche indexé et le filtre de sécurité ne reflétera pas les règles de sécurité réelles car l'élément de l'index détiendra d'anciennes informations de sécurité. Vous avez besoin d'une sorte d'indexation de sous-couche pour infliger l'indexation de tous les subitems sur le changement de sécurité.


Techniquement, je pense que la solution est exactement la même que celle que vous indice tous les rôles de l'élément et de la mise en œuvre effective de Comment vous obtenez ces rôles à vous, mais le code fourni devrait le faire. Dans GetPermissibles méthode. J'aurais accepté cela comme la réponse aussi si je pouvais avoir.



5
votes

Après plus d'autres recherches, le Linq à Sitecore Article m'a signalé aux lignes de code suivantes: xxx pré>

creuser par sitecore.contensearch.dll code> et sitecore.contensarch.luceneprovider.dll dans DotPek Decompiler et la mention du indexing.filterindex.outbound Code> Pipeline dans le document de recherche SITECORE 7 J'ai trouvé le code suivant: p>

sitecore.contensarch.luceneprovider.lucenesearkreults strong> p>

public class ApplyOutboundSecurityFilter : OutboundIndexFilterProcessor
{
    public override void Process(OutboundIndexFilterArgs args)
    {
      if (args.IndexableUniqueId == null || !(args.IndexableDataSource == "Sitecore"))
        return;
      ItemUri uri = new ItemUri(args.IndexableUniqueId);
      if (args.AccessRight != AccessRight.ItemRead || Database.GetItem(uri) != null)
        return;
      args.IsExcluded = true;
    }
}


2 commentaires

Les pipelines entrants et sortants vous permettent d'appliquer la logique pour inclure / exclure un élément tel qu'il est ajouté à l'index et tel qu'il est récupéré de celui-ci. Au fur et à mesure que vous parlez de la logique, vous faites ici, plus vous devez envisager des performances car elles seront appliquées à chaque article.


Ceci est intégré à Sitecore 7+ mais comme des Sergejs commentés, les arg.indexabledatasource échouera car la valeur réelle est minuscule "sitecore". D'après ce que je peux voir, ils ont réparé cela en 8.0, mais cela échoue dans 7,5 tous les Revs.



16
votes

Une légère alternative à la suggestion de Klaus:

dans sitecore.contentsach.config code> Vous trouverez un pipeline appelé contessearch.geglobalsearchFilters code> p> p> Les processeurs ajoutés à ce pipeline seront appliqués à n'importe quelle requête, de sorte que si nous déposons un filtre qui applique un filtre basé sur des rôles, nous sommes bons. p>

Computedfield H2>

Pour commencer, Nous voulons un champ calculé ajouté à notre configuration d'index: p> xxx pré>

note strong> Le type stocké est une collection de chaînes. Nous allons l'utiliser pour indexer tous les noms des rôles pouvant lire un élément. P>

Mise en œuvre h3>
  1. Nous avons une classe abstraite de base pour gérer l'extraction des détails de la sécurité des articles P> XXX PRE> LI>

  2. Nous implémentons ce qui précède avec la méthode abstraite p> XXX PRE> LI> ol>

    Note forte> Il existe évidemment un impact sur la performance ici, cela réduira votre vitesse d'indexation. Pour réduire l'impact, n'ajoutez que le champ calculé à la configuration d'index pour l'index contenant du contenu sécurisé. Par exemple. Si votre contenu Web est accessible uniquement par l'utilisateur anonyme, il n'ajoutera aucun avantage. P>

    Pipeline H2>

    Ajoutez l'entrée dans la configuration p>

    public class ApplyGlobalReadRolesFilter : GetGlobalFiltersProcessor
    {
        public override void Process(GetGlobalFiltersArgs args)
        {
            var query = (IQueryable<SitecoreUISearchResultItem>)args.Query;
    
            var userRoles = Context.User.Roles.Select(r => r.Name.Replace(@"\", @"\\"));
    
            var predicate = PredicateBuilder.True<SitecoreUISearchResultItem>();
            predicate = userRoles.Aggregate(predicate, (current, role) => current.Or(i => i["read_roles"].Contains(role)));
    
            if(predicate.Body.NodeType != ExpressionType.Constant)
                args.Query = query.Filter(predicate);
        }
    }
    


3 commentaires

Great Réponse, je préférerais prendre le coup à l'heure indicielle plutôt que le temps de requête et la ré-indexation en raison de changements de sécurité est acceptable. Pour être juste, dans ce projet, il n'ya pas de nombreux articles afin que la vérification des autorisations à l'exécution n'aura pas un impact énorme, mais j'aimerais connaître les options pour les exigences futures.


Article sur Champs d'index calculés dans Sitecore 7


Devrait probablement ajouter une légère clause de non-responsabilité ... Je suis le plus récent membre de l'équipe Sitecore 7 ;-) Les champs calculés sont une grande chose, ils vous permettent de manipuler les propriétés de votre indexable de votre manière que vous pouvez imaginer et économiser directement à l'index. Si vous pouvez effectuer le traitement tout en indexant que vos requêtes deviennent beaucoup plus simples et plus puissantes.



0
votes

Les développeurs de Sitecore ont fait une erreur idiote, elle ne fonctionnera jamais, à cause de cette déclaration: Si ((arg.indexableuniqueid! = null) && (arg.indexabledatasource == "sitecore"))

Comme arg.indexabledataSource sera toujours égal à "Sitecore", pas "sitecore". Je met actuellement la mise à niveau de Big Project vers la dernière mise à jour 7.2 et découvra cette erreur idiote, OH SITECORE Devs Erreurs habituelles :)


0 commentaires