不像js或者c,moonbit这种静态类型且类型安全的语言,有这样一种特性:特定的某个对象是无法伪造的。所以可以考虑使用object capability的形式实现权限管理。简单的说,就是“如果你没有某个令牌对象的引用,就没法使用它所对应的权限”。
大致思路如下,以简单的文件读写为例:
1、在模块1中创建一个抽象类型File
,作为文件读写权限的令牌,提供以下api:
pub fn get_file_from_path(path : String) -> File? {
... // 调用模块内部私有的ffi函数
}
pub fn read(self : File) -> String
pub fn write(self: File, text : String) -> Unit
2、在模块2中引入并导出模块1中的所有内容,除了创建File
的函数。
3、定义安全模块:没有直接或间接依赖模块1的模块。
于是安全模块中只能读写 由不安全模块创建的文件。
同样的手段可以用来表示“获取File对象的权限”,即get_file_from_path这个函数对象本身。以及“获取get_file_from_path这个对象的权限”。
权限的细化也可以通过定义新的抽象类型或者闭包实现:
pub fn readonly(self : File) -> () -> String {
fn() { self.read() }
}
或者像参考资料1那样。moonbit里可以用trait object。
除了文件库,任何需要管理权限的都可以参照这种形式,详见参考资料。
一些参考资料:
- scheme中的object capability ( spritely-core )
- From Desktops to Donuts: Object-Caps Across Scales ( Youtube )
- 线性类型下的object capability ( Austral语言 )
- GitHub - dckc/awesome-ocap: Awesome Object Capabilities and Capability Security