2010-09-08 2 views
1

Je tente de stocker des règles pour les requêtes Web dans un objet JSON et j'ai du mal à penser à une bonne structure. Voici quelques exemples de mes règles:Construction d'une structure JSON pour stocker des règles pour les requêtes Web

conditions

the user must be logged in 
the user must belong to an account of type [____] 
the user must belong to an account named [___] 
the user must have a username [___] 
the user must have the account role [___] 
the current time must be between [___] and [___] 
the variable [___] must be set to [___] 

Actions possibles succès

allow access to the requested view 
redirect to download a specific file 

défaillance possibles Actions

redirect to a certain view to display reasons why access was denied 
redirect to a purchase page 
redirect to a login page with a notice explaining why access was denied 

J'ai besoin de stocker plusieurs règles dans un seul objet. Je dois aussi être en mesure de stocker des relations booléennes comme ceci:

(rule1 && rule2) || rule3 

structure de l'objet est normalement facile pour moi, mais je me bats mettre ensemble. Voici un exemple d'une exigence que l'objet JSON devrait pouvoir stocker:

Un utilisateur peut accéder au panneau de contrôle s'il est connecté et appartient à un compte nommé «Propriétaires». Si l'utilisateur a le rôle de compte "Employé", il ne peut se connecter que du lundi au vendredi, pas le week-end. Si l'utilisateur a le nom "root", il peut se connecter indépendamment de toute autre règle. Si aucune règle ne réussit, redirigez l'utilisateur vers une page lui indiquant précisément pourquoi il est impossible d'accéder au panneau de configuration. Par exemple, "C'est le week-end et vous êtes seulement autorisé à vous connecter du lundi au vendredi."

+0

Voulez-vous l'utiliser pour la validation côté client? Ou pour synchroniser la validation côté serveur et côté client? Ou juste comme un format de stockage pratique? Vous pouvez, par exemple, Jetez un coup d'œil à la façon dont les annotations de données asp.net et la validation côté client mvc2 fonctionnent. – VolkerK

Répondre

1

Consultez Amazon S3 Bucket Policies correspond à la facture. C'est déjà dans JSON. Essayez d'étendre les conditions avec les vôtres et étendez les actions d'effet pour inclure un message.

http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?AccessPolicyLanguage.html

Je dirais que essayer la recherche d'un outil de création de la politique seau Amazon open source que vous pouvez prolonger mais je ne suis pas trouver quoi que ce soit avec une simple recherche google.

+0

Cela a été extrêmement utile, et essentiellement ce que je cherchais. Merci Rob! –

1

Il existe plusieurs façons de créer un moteur de décision rudimentaire. S'il n'y a pas trop de règles impliquées, vous pouvez même modéliser une structure de table de décision commune (conditions & actions) directement au format JSON. Comme VolkerK mentionné, il n'est pas clair si la validation du client et/ou du serveur est requise.

Un format très simple pourrait utiliser des masques de bits (populaire dans la programmation de l'API Windows :) Vous pouvez même le passer entre le client et le côté serveur comme une simple chaîne. À un certain moment cependant, le nombre de règles peut devenir lourd. Un de nos systèmes à la boutique utilise un moteur de règles métier en raison du nombre de choix.

Voici un petit extrait qui doit générer une chaîne binaire: 1010001

 
<!DOCTYPE html> 
<html><head><title>Bitmask</title></head> 
<body> 

<div id="output"></div> 
<script type="text/javascript"> 
var out = document.getElementById('output'); 

var R_IS_LOGGED_IN = 1; 
var R_HAS_ACCT_TYPE_X = 2; 
var R_HAS_ACCT_TYPE_Y = 4; 
var R_HAS_USER_NAME = 8; 
var R_HAS_ROLE_X  = 16; 
var R_HAS_ROLE_Y  = 32; 
var R_VAR_X_IS_A  = 64; 
var R_VAR_X_IS_B  = 128; 

var attrs_as_string = 
    (R_IS_LOGGED_IN | R_HAS_ROLE_X | R_VAR_X_IS_A).toString(2); 

out.innerText = attrs_as_string; 
</script> 
</body> 
</html> 

Vous pouvez ensuite précalculer les combinaisons souhaitées de conditions et éventuellement utiliser une dépêche approche de tableau simple switch/case:

 
switch(computed_bitmask) { 
    case '11001' : do_this(); break; 
    case '1101' : do_that(); break; 
    default: do_whatever(); 
} 
+0

Merci jtpresta, j'ai toujours voulu savoir comment les permissions des masques de bits fonctionnaient - c'était utile! –

+0

Vous êtes les bienvenus. Ils peuvent être utiles parfois :) – JTP