You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OneAuth/docs/integration.md

131 lines
3.6 KiB
Markdown

# VBase 集成指南
本文档介绍如何将 VBase 作为基础库集成到现有的 Golang 项目中,并使用其权限管理系统。
## 1. 安装
```bash
go get github.com/veypi/vbase
```
## 2. 初始化
在你的应用入口文件(如 `main.go``init.go`)中进行初始化。
```go
package main
import (
"github.com/veypi/vbase"
"github.com/veypi/vbase/cfg"
"github.com/veypi/vbase/auth"
"github.com/veypi/vigo"
)
// 1. 创建你的应用 Router
var Router = vigo.NewRouter()
// 2. 创建你的应用 Auth 实例 (指定 Scope)
var AppAuth = auth.Factory.New("my_app")
func init() {
// 3. 挂载 VBase 路由 (提供登录、用户管理等基础接口)
Router.Extend("/vb", vbase.Router)
// 4. 配置数据库连接 (如果尚未配置)
// export DSN="root:password@tcp(127.0.0.1:3306)/myapp?charset=utf8&parseTime=True"
}
func main() {
// 5. 初始化数据库迁移
if err := vbase.Init(); err != nil {
panic(err)
}
// 6. 启动服务
app := vigo.New("myapp", Router, cfg.Global, nil)
panic(app.Run())
}
```
## 3. 使用权限系统
### 3.1 定义路由权限
使用 `AppAuth` 实例的中间件方法来保护你的路由。
```go
func init() {
// 需要登录
Router.Use(AppAuth.Login())
// 资源操作示例
// 假设你的资源是 "article"
// 创建文章 (需要 "article" 的创建权限 Level 1)
Router.Post("/articles", AppAuth.PermCreate("article"), CreateArticle)
// 读取文章 (需要 "article:{id}" 的读取权限 Level 2)
Router.Get("/articles/{id}", AppAuth.PermRead("article:{id}"), GetArticle)
// 更新文章 (需要 "article:{id}" 的写入权限 Level 4)
Router.Put("/articles/{id}", AppAuth.PermWrite("article:{id}"), UpdateArticle)
// 删除文章 (需要 "article:{id}" 的管理员权限 Level 7)
Router.Delete("/articles/{id}", AppAuth.PermAdmin("article:{id}"), DeleteArticle)
}
```
### 3.2 业务逻辑授权
在创建资源时,通常需要授予创建者管理权限。
```go
func CreateArticle(x *vigo.X, req *ArticleReq) (*Article, error) {
// 1. 获取当前用户
userID := AppAuth.UserID(x)
// 2. 创建资源逻辑...
article := &Article{Title: req.Title, AuthorID: userID}
db.Create(article)
// 3. 授予权限
// 授予用户对该文章的管理员权限 (Level 7)
// 这样用户后续可以读取、修改、删除该文章
permissionID := fmt.Sprintf("article:%s", article.ID)
if err := AppAuth.Grant(x.Context(), userID, permissionID, auth.LevelAdmin); err != nil {
// 处理错误 (通常记录日志)
x.Log.Error("Failed to grant permission", "err", err)
}
return article, nil
}
```
### 3.3 复杂场景:项目成员管理
假设你有一个项目管理系统,用户可以被邀请加入项目。
```go
// 邀请成员接口
func InviteMember(x *vigo.X, req *InviteReq) error {
// 检查当前用户是否有权限邀请 (通常需要管理员权限)
// 这一步由路由中间件 PermAdmin("project:{id}") 保证
// 授予被邀请人读取权限 (Level 2)
permID := fmt.Sprintf("project:%s", req.ProjectID)
return AppAuth.Grant(x.Context(), req.TargetUserID, permID, auth.LevelRead)
}
```
## 4. 配置说明
VBase 使用 `cfg` 包管理配置,支持环境变量。
- `DB_DSN`: 数据库连接字符串
- `DB_TYPE`: 数据库类型 (mysql, postgres, sqlite)
- `JWT_SECRET`: JWT 签名密钥 (生产环境务必修改)
- `JWT_ISSUER`: Token 签发者
更多配置详情请参考 [配置文档](./configuration.md)。