2010-09-08 62 views
1

我试图在JSON对象中存储Web请求的规则,并且很难考虑良好的结构。下面是我的一些规则的例子:构建JSON结构以存储Web请求的规则

可能条件下

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 [___] 

可能成功操作

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

可能的失败操作

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 

我需要在一个对象中存储多个规则。我还需要能够存储这样的布尔关系:

(rule1 && rule2) || rule3 

对象结构通常都得来不易给我,但我挣扎把这个在一起。以下是JSON对象可以存储的要求示例:

用户可以访问控制面板(如果他们已登录并属于名为“所有者”的帐户)。如果用户具有账户角色“员工”,那么他们只能在星期一至星期五登录,而不能在周末登录。如果用户拥有“root”这个名称,他们可以登录而不管其他任何规则。如果没有规则成功,那么将用户重定向到一个页面,告诉他们为什么他们无法进入控制面板。例如,“这是周末,你只能在周一到周五登录。”

+0

你想使用它进行客户端验证吗?或保持服务器端和客户端验证同步?或者只是一种便利的存储格式?你可以例如看看asp.net数据注释和mvc2客户端验证是如何工作的。 – VolkerK 2010-09-08 05:26:13

回答

1

查看Amazon S3 Bucket Policies符合法案。它已经在JSON中。尝试扩展您自己的条件并扩展效果动作以包含消息。

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

我要说尝试寻找一个开源的亚马逊桶政策制作工具,可以延长,但我没有找到一个简单的谷歌搜索什么。

+0

这是非常有用的,基本上我在找什么。感谢Rob! – 2010-09-09 23:34:01

1

有很多方法可以构建一个基本的决策引​​擎。如果涉及的规则不太多,您甚至可以使用JSON格式直接建模一个通用决策表结构(条件为&动作)。正如VolkerK所述,目前还不清楚是否需要客户端和/或服务器验证。

一个非常简单的格式可以使用位掩码(在Windows API编程中很流行:)你甚至可以在客户端和服务器端之间传递它作为一个简单的字符串。但是,在某些时候,规则的数量会变得很难处理。由于选择的数量众多,我们在商店中的一个系统实际上使用了业务规则引擎。

这里有一个小片断,它应该输出二进制字符串: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> 

然后,您可以预先计算的条件所需的组合以及可能使用一个简单的开关/箱调度表的方法:

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

谢谢jtpresta,我一直想知道位掩码权限是如何工作的 - 这很有帮助! – 2010-09-09 23:34:32

+0

不客气。他们有时可以有所帮助:) – JTP 2010-09-15 01:48:19