# goose
**Repository Path**: lantsang/goose
## Basic Information
- **Project Name**: goose
- **Description**: 基于GBAC的权限控制系统
- **Primary Language**: NodeJS
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-01-30
- **Last Updated**: 2022-01-26
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Nodejs
## README
## Goose --- 让权限设计更易上手
### 项目简介
>Goose, easy way to control your resources.
Goose是基于权限的访问控制系统,全称GBAC(guard-based access control),得益于[nestjs](https://nestjs.com/)生态的快速发展,Goose可以提供比传统RBAC(role-based access control)更加精细化的权限管理,在满足基本需求的同时也保持着极其灵活的可扩展性。
### 应用场景
对于复杂的系统或者企业级应用来说,权限控制系统是整个系统的基础设施。如何把企业实际的应用场景代入到软件系统并实现无缝连接是一个复杂的问题。权限控制系统分为以下几个层级:
- 无权限控制系统
- 权限与用户绑定,引入权限和用户
- 基于角色的权限控制系统,引入权限、角色和用户
- 基于权限的权限控制系统,引入权限、角色、用户和组织、
Goose系统可用于电商、金融、零售、餐饮和物联网等平台,作为这些平台的基础架构的一部分,满足企业内部和平台自身对于资源和权限精细化控制的需求。
### 两个问题
通用的系统权限架构在设计时需要考虑以下两点情形:
- 我能看到哪些资源?对应CRUD里面的R(查询);
- 我能管理哪些资源?对应CRUD里面的CUD(创建、更新和删除);
### 我能看到哪些资源
`注意:` 满足以下任意一点即可
- 我创建的资源;
- 我的下级组织创建的资源;
### 我能管理哪些资源
`注意:` 必须满足下方所有条件
- **[我能看到这些资源](#jump_1)**;
- 我有这些资源的管理权限,比如对于一个区域来说,除了要有**区域查看**权限,还要有**区域管理**的权限;
### 代码片段(管理资源)
以下代码片段为资源管理相关的权限配置,重点注意这两行
``` typescript
@Authorities(Guard.AreaManage)
@UseGuards(AuthGuard(), AuthoritiesGuard)
```
``` typescript
@ApiOperation({ summary: '创建一个区域' })
@ApiOkResponse({ description: '返回新建区域的编号', type: UuidResDto })
@Authorities(Guard.AreaManage)
@UseGuards(AuthGuard(), AuthoritiesGuard)
@Post()
async create(@Body() { name }: CreateOrUpdateAreaAdminReqDto): Promise {
try {
const count = await this.areaService.checkDuplicateByName(name);
if (count > 0) throw new HttpException(`${name}已存在,不能重复创建`, HttpStatus.BAD_REQUEST);
const area = await this.areaService.create(name);
return { uuid: area.uuid };
} catch (error) {
if (error instanceof HttpException) throw error;
this.logService.error(LogAppender.area, `Cannot create area by ${name}, the error is ${error}`, this.lantUtil.parseError(error));
throw new HttpException(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
```
### 代码片段(查看资源)
以下代码片段为资源管理相关的权限配置,重点注意这两行
``` typescript
@Authorities(Guard.AreaManage, Guard.AreaView)
@UseGuards(AuthGuard(), AuthoritiesGuard)
```
``` typescript
@ApiOperation({ summary: '获取区域列表' })
@ApiOkResponse({ description: '返回区域列表', type: GetAreaListAdminResDto, isArray: true })
@Authorities(Guard.AreaManage, Guard.AreaView)
@UseGuards(AuthGuard(), AuthoritiesGuard)
@Get()
async getAll(@Query() query: GetAreaListAdminReqDto): Promise {
try {
//通过请求上下文获取当前用户
const currentUser = RequestContext.currentUser();
//获取当前用户所有下级组织编号
const organizationIdList = await this.organizationService.findDescendantsById(currentUser.jobId);
//获取当前用户的下级组织能查看的所有组织列表
const [areaList, count] = await this.areaService.findAndPaging(query.page_index, query.page_size, query.sort_type, query.name, organizationIdList);
return {
total_count: count,
data: await Promise.all(
areaList?.map(async area => {
const creator = await this.userService.findOne(area.createdBy);
return {
uuid: area.uuid,
name: area.name,
description: area.description,
created_by: creator?.displayName,
created_at: area.createdAt,
updated_at: area.updatedAt
};
})
)
};
} catch (error) {
if (error instanceof HttpException) throw error;
this.logService.error(LogAppender.area, `Cannot get areas, the error is ${error}`, this.lantUtil.parseError(error));
throw new HttpException(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
```
### 环境要求
- node 12.18.3
- Postgresql 12
- Redis
如果本地没有安装 PostgresQL 和 redis,可以用 docker 启动服务
- 安装 docker 和 docker-compose: [指南](https://docs.docker.com/compose/install/)
- 运行`docker-compose up -d`
### 本地安装
```base
$ yarn install #安装npm依赖
```
### 本地运行
`注意:` 首先查看 `.env.development` 中的配置是否正确
```bash
$ cp .env.development .env # 生成 .env 文件
$ yarn start:dev #本地测试环境启动
$ yarn build #构建打包
```
### 系统截图




### 演示环境
[演示环境](https://goose.lantsang.net/)用来帮助开发人员快速了解系统的使用方法,可以登录不同的账号来体验系统。
- lantsang, 源江科技下的用户,相当于管理者身份,但是它只有查看权限,没有管理权限
- developer, 源江科技->开发部下的用户,有资源管理权限,但是只能看到他及其下组织内的用户创建的资源
- tester, 源江科技->测试部下的用户,有资源管理权限,但是只能看到他及其下组织内的用户创建的资源
`注意:` 以上账号的密码都是123456
### 联系作者
