幼儿园(Kindergarten):为你的业务逻辑保驾护航
项目介绍
幼儿园(Kindergarten) 是一个基于沙箱模式的开源项目,旨在帮助开发者将业务逻辑模块化,并为这些模块添加一层安全防护。无论你使用的是VueJS、React、Angular、Ember还是Backbone等前端框架,Kindergarten都能完美适配,为你的应用提供强大的安全保障。
项目技术分析
Kindergarten的核心思想是将应用的业务逻辑划分为多个Perimeter(周边),每个Perimeter代表应用中的一个区域(如组件、页面、按钮等)。每个Perimeter定义了可以暴露的方法以及必须遵循的规则。这些Perimeter被加载到一个**Sandbox(沙箱)中,并通过一个Governess(女教师)**来确保所有规则得到遵守,防止任何未经授权的操作。
关键组件
- Perimeter(周边):定义业务逻辑模块,包含暴露的方法和规则。
- Sandbox(沙箱):加载和管理Perimeter,通过Governess确保规则的执行。
- Governess(女教师):负责监控和执行规则,防止未经授权的操作。
- Child(孩子):代表当前应用的用户。
项目及技术应用场景
Kindergarten适用于需要高度安全性和模块化管理的应用场景,特别是在以下情况下:
- 多用户权限管理:适用于需要根据用户角色和权限来控制访问的应用,如企业管理系统、社交平台等。
- 复杂业务逻辑:适用于业务逻辑复杂、需要模块化管理的应用,如电商系统、金融平台等。
- 前端框架集成:适用于需要与多种前端框架集成的应用,如单页应用(SPA)、移动应用等。
项目特点
- 模块化设计:通过Perimeter将业务逻辑模块化,便于管理和维护。
- 安全防护:通过Governess确保所有规则得到执行,防止未经授权的操作。
- 灵活集成:支持与多种前端框架集成,如VueJS、React、Angular等。
- 丰富的规则定义:支持多种规则定义方式,如正则表达式、函数等。
- 易于扩展:支持自定义Governess,满足不同应用的安全需求。
示例代码
以下是一个简单的示例,展示了如何使用Kindergarten来管理用户的操作权限:
import {
createPerimeter,
createSandbox
} from 'kindergarten';
import { guard } from 'kindergarten/lib/decorators';
import Child from './Child';
import Television from './Television';
import CableTv from './CableTv';
// 定义Perimeter
const homePerimeter = createPerimeter({
purpose: 'home',
can: {
watch: [Television],
eat(candy) {
// 只允许吃5颗糖果
return this.child.eatenCandies < 5;
}
},
cannot: {
watch: [CableTv],
visitWebPage: /drugs|sex|rock-and-roll|guns/
},
expose: [
'watchTv',
'browseInternet',
'eat'
],
watchTv(tv) {
this.guard('watch', tv);
console.log(`${this.childName()} is watching ${tv.type}`);
},
@guard
eat(candy) {
console.log(`${this.childName()} is eating a candy #${++this.child.eatenCandies}`);
},
@guard('visitWebPage')
browseInternet(site) {
console.log(`${this.childName()} is browsing on following site: ${site}`);
},
childName() {
return `${this.child.name}`;
}
});
// 定义Child
const child = new Child("John Smith Jr.");
// 定义Sandbox
const sandbox = createSandbox(child);
sandbox.loadModule(homePerimeter);
// 正常操作
sandbox.home.watchTv(new Television());
// 抛出AccessDenied错误
sandbox.home.watchTv(new CableTv());
sandbox.home.watchTv(CableTv);
// 一段时间后失败
for (let i = 0; i <= 6; i++) {
sandbox.home.eat('Tasty Candy');
});
sandbox.home.browseInternet('http://google.com'); // 正常
// 抛出AccessDenied错误
sandbox.home.browseInternet('http://buy-drugs-and-guns-online.com');
安装与使用
安装
通过npm安装Kindergarten:
yarn add kindergarten
使用
Kindergarten提供了多种使用方式,包括继承Sandbox
类、使用装饰器等。以下是一个简单的使用示例:
import { Sandbox } from 'kindergarten';
class MyClass extends Sandbox {
constructor(currentUser, perimeters) {
this.child = currentUser;
this.loadPerimeter(...perimeters);
}
@guard
someProtectedMethod() {
// 这个方法将被保护
}
}
结语
Kindergarten通过模块化和安全防护机制,为你的应用提供了强大的业务逻辑管理和安全保障。无论你是前端开发者还是全栈工程师,Kindergarten都能帮助你更好地管理和保护你的应用。快来尝试一下吧!