ALFA是否支持常量定义?或可通过何种方式模拟常量?
ALFA的常量定义支持及替代方案
首先直接给结论:从你参考的2015年发布的ALFA工作草案(alfa-for-xacml-v1.0-wd01)来看,ALFA本身并没有原生的常量定义语法,不过我们可以通过几种方式模拟常量的效果,解决重复值修改繁琐的问题,下面具体说明:
1. 用无参数函数模拟常量
这是最直接的替代方法。你可以定义一个不接收参数的函数,让它返回固定的常量值,之后在策略的任何地方调用这个函数就行。举个例子:
// 定义"常量"函数 function REPORT_TYPE() string { return "my.company.attributes.medicalReport" } // 在目标语句中使用 target clause requestedType == REPORT_TYPE()
以后要修改这个值的时候,只需要改函数里的返回内容,所有引用的地方都会自动同步,不用一个个查找替换,完美解决冗余问题。
2. 属性别名复用固定值
如果你的常量刚好对应某个业务属性的标准值,还可以用命名空间下的属性别名来实现类似效果。比如:
namespace my.company.attributes { attribute medicalReport string // 这里相当于定义了一个属性别名 } // 后续直接引用这个别名 target clause requestedType == my.company.attributes.medicalReport
这种方式更符合ALFA和XACML的属性模型设计,适合属性相关的常量场景。
3. 模拟枚举类型
对于像你提到的SUBJECT_TYPES这类枚举场景,我们可以用多个函数分别定义每个枚举值:
function SUBJECT_TYPE_PATIENT() string { return "PATIENT" } function SUBJECT_TYPE_USER() string { return "USER" } function SUBJECT_TYPE_EXAM() string { return "EXAM" } function SUBJECT_TYPE_REPORT() string { return "REPORT" } // 使用时直接调用对应函数 target clause subjectType == SUBJECT_TYPE_REPORT()
虽然没有原生枚举那么简洁,但一样能做到集中管理、统一修改的目的。
需要提醒的是,如果后续ALFA有版本更新,可能会加入原生的常量或枚举支持,但基于你参考的这份2015年草案,上面这些就是最实用的模拟方案了。
内容的提问来源于stack exchange,提问作者OneWorld
相关产品推荐
相关产品推荐

