alloy - 了解合金中的约束
问题描述
我正在为我的公司黑客马拉松探索 Alloy。我们有一个复杂的数据模型,我的目标是生成正确示例的图片,以便新员工可以看到它们并了解我们的应用程序。我设法偶然发现并生成了一些图片,但我无法表达以下想法:
角色可以授予对一个或多个字段的访问权限。用户具有一个或多个角色,并且可以访问零个或多个字段。当且仅当用户具有授予对该字段的访问权限的角色时,用户才能访问该字段。
这是语法错误的众多尝试之一;希望它表明我对合金的工作原理有什么误解。
sig Role { grantsAccess: some Field }
sig User {
has: some Role,
canAccess: Field
}{
all u: User |
f: Field in u.canAccess iff some r: Role in u.has | f in r.grantsAccess
}
谢谢!
解决方案
-- A role can grant access to one or more fields.
sig Role { grant : some Field }
sig Field {}
-- A user has one or more roles,
-- and can access zero or more fields.
sig User {
roles : set Role
}
-- A user can access a field
pred User.canAccess[ field : Field ] {
-- if and only if the user has a role
-- which grants access to that field.
some role : this.roles | field in role.grant
// alternative:
// some ( this.roles & grant.field )
}
run ex1 {
some u : User, f : Field {
u.canAccess[f]
}
}
推荐阅读
- python - 用于打印树结构的 Python 递归函数在 for 循环中重置变量
- docker - ElasticSearch Docker Swarm 集群问题:“master_not_discovered_exception”
- ngx-charts - 有没有办法在圆环图中将标签居中?
- c# - 使用 C# 中列表中的数据填充 Excel 一维数组
- ssl - 是否可以在没有 ssl 的情况下在 NGINX 端口 443 上运行 HTTP/2?
- android - 如何在颤振应用中播放声音时分别控制左右音量(想象戴着耳机)?
- unity3d - 在新的 Unity 输入系统中如何映射到 KeyCode.JoystickButton0?
- python - 将opencv的站点包路径添加到全局站点包python
- javascript - SetTimeout 功能:发送到客户端后无法设置标头
- nginx - 带有子域的 Nginx