2016-02-29 4 views
1

Je ne peux pas comprendre comment écrire une règle qui résoudrait cette exigence:XACML vérification des règles entre les ressources et sujet avec XPath

Supposons que j'ai cette demande:

<Request> 
    <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"> 
    <Content> 
     <Categories> 
     <Category name="cat1"> 
      <CategoryValue>A</CategoryValue> 
      <CategoryValue>B</CategoryValue> 
      <CategoryValue>C</CategoryValue> 
     </Category> 
     <Category name="cat2"> 
      <CategoryValue>B</CategoryValue> 
      <CategoryValue>E</CategoryValue> 
      <CategoryValue>F</CategoryValue> 
     </Category> 
     </Categories> 
    </Content> 
    </Attributes> 
    <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"> 
    <Content> 
     <Categories> 
     <Category name="cat1"> 
      <CategoryValue>A</CategoryValue> 
     </Category> 
     <Category name="cat2"> 
      <CategoryValue>A</CategoryValue> 
      <CategoryValue>E</CategoryValue> 
      <CategoryValue>F</CategoryValue> 
      <CategoryValue>G</CategoryValue> 
     </Category> 
     </Categories> 
    </Content> 
    </Attributes> 
</Request> 

Je veux écrire une politique qui contient une règle avec un permis effet lorsque pour chacun des éléments Category de la ressource, le sujet a une Category avec le même @nameet si ces deux éléments a Category à l est un commun CategoryValue.

Dans cet exemple ci-dessus:

  • ressources a "cat1" avec "A" - sujet a "cat1" avec une valeur qui est un: permis
  • ressource a "cat2" avec "A" , "E", "F", "G" - sujet a "cat2" avec une valeur E (ou F): permis
  • résultat final de la règle: permis

Ma question n'est pas sur lequel functionId Je devrais utiliser, mais comment puis-je combiner ces conditions s o que la règle se comporte comme je l'ai décrit? Comment comparer les GenericValue éléments de nœuds qui ont le même @name?

Je pense que je vais devoir utiliser la fonction string-at-least-one-member-of entre les valeurs du sujet et de la ressource "cat1", puis entre le sujet et la ressource "cat2", mais la vraie difficulté est que le PDP n'a aucune idée de @name des éléments Category, donc je ne peux pas le coder directement dans la règle et je ne sais pas comment les sélectionner en particulier pour effectuer la vérification.

Une idée à ce sujet?

Répondre

0

Tout d'abord, votre requête n'est pas valide. Il vous manque certains éléments, par ex.

  • ReturnPolicyIdList = "true"
  • CombinedDecision = "true"

Deuxièmement, je vous recommande de ne pas utiliser XPath dans XACML. Cela rend vos politiques difficiles à écrire (d'où votre question), difficiles à maintenir et difficiles à lire (audit). Cela va à l'encontre du but de XACML. Laissez le PEP effectuer le traitement XML lourd et envoyer des attributs avec des valeurs d'attribut plutôt qu'avec du contenu XML.

En outre, vous ne pouvez pas contrôler l'itération sur les différents éléments/valeurs d'attribut dans le code XML dans XACML. Je peux implémenter votre cas d'utilisation avec une valeur spécifique @name mais je n'arrive pas à le faire sur un ensemble de valeurs.

En supposant une valeur unique, vous devez mettre en œuvre une condition comme suit:

<xacml3:Rule RuleId="axiomatics-example-xacml30" Effect="Permit" xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"> 
    <xacml3:Target/> 
    <xacml3:Condition > 
      <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of"> 
       <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"/> 
       <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"/> 
      </xacml3:Apply> 
    </xacml3:Condition> 
</xacml3:Rule> 

Mais vous ne pouvez pas vraiment itérer sur les différentes valeurs

+0

ok, je ferai comme vous le dites par prétraitement le XML dans le PEP. Merci pour cette réponse :) – Kwoinkwoin