|
|
# VBase 集成指南
|
|
|
|
|
|
本文档介绍如何将 VBase 作为基础库集成到现有的 Golang 项目中,并使用其权限管理系统。
|
|
|
|
|
|
## 1. 安装
|
|
|
|
|
|
```bash
|
|
|
go get github.com/veypi/vbase
|
|
|
```
|
|
|
|
|
|
## 2. 初始化
|
|
|
|
|
|
在你的应用入口文件(如 `main.go`)中进行初始化。
|
|
|
|
|
|
```go
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
"github.com/veypi/vbase"
|
|
|
"github.com/veypi/vbase/cfg"
|
|
|
"github.com/veypi/vigo"
|
|
|
)
|
|
|
|
|
|
func main() {
|
|
|
// cfg.Global 已包含默认配置(SQLite 内存数据库)
|
|
|
// 可通过环境变量或 YAML 文件覆盖
|
|
|
app := vigo.New("myapp", vbase.Router, cfg.Global, vigo.WithInit(vbase.Init))
|
|
|
panic(app.Run())
|
|
|
}
|
|
|
```
|
|
|
|
|
|
VBase 自带嵌入式管理界面,启动后访问 `/vb/` 即可使用。
|
|
|
|
|
|
### 2.1 挂载路由
|
|
|
|
|
|
VBase Router 已内置所有 API 路由(`/api/auth`、`/api/users`、`/api/roles`、`/api/oauth`、`/api/settings` 等)和 UI 路由(`/vb/`、`/v/`、`/vhtml/`)。
|
|
|
|
|
|
如果你的应用需要自定义路由,将 VBase Router 挂载到你的 Router 上:
|
|
|
|
|
|
```go
|
|
|
var Router = vigo.NewRouter()
|
|
|
|
|
|
func init() {
|
|
|
// 将 VBase 挂载到 /vb 前缀
|
|
|
Router.Extend("/vb", vbase.Router)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
## 3. 使用权限系统
|
|
|
|
|
|
VBase 通过 `cfg.Auth` 提供全局权限管理实例。所有中间件方法前缀为 `Require*`。
|
|
|
|
|
|
### 3.1 定义路由权限
|
|
|
|
|
|
```go
|
|
|
func init() {
|
|
|
// 所有路由需要登录
|
|
|
Router.Use(cfg.Auth.Login())
|
|
|
|
|
|
// 资源操作示例
|
|
|
// 创建文章 (需要 "article" 的创建权限 Level 1)
|
|
|
Router.Post("/articles", cfg.Auth.RequireCreate("article"), CreateArticle)
|
|
|
|
|
|
// 读取文章 (需要对特定实例的读取权限 Level 2)
|
|
|
Router.Get("/articles/{id}", cfg.Auth.RequireRead("article:{id}"), GetArticle)
|
|
|
|
|
|
// 更新文章 (需要对特定实例的写入权限 Level 4)
|
|
|
Router.Put("/articles/{id}", cfg.Auth.RequireWrite("article:{id}"), UpdateArticle)
|
|
|
|
|
|
// 删除文章 (需要对特定实例的管理员权限 Level 7)
|
|
|
Router.Delete("/articles/{id}", cfg.Auth.RequireAdmin("article:{id}"), DeleteArticle)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 3.2 权限码动态解析
|
|
|
|
|
|
权限码支持动态占位符,从不同来源获取值:
|
|
|
|
|
|
| 语法 | 来源 | 示例 |
|
|
|
|------|------|------|
|
|
|
| `{key}` 或 `{key@ctx}` | Context | `{appID}` |
|
|
|
| `{key@path}` | 路径参数 | `{appID@path}` |
|
|
|
| `{key@query}` | Query 参数 | `{appID@query}` |
|
|
|
| `{key@header}` | Header | `{Authorization@header}` |
|
|
|
|
|
|
### 3.3 业务逻辑授权
|
|
|
|
|
|
在创建资源时,授予创建者管理权限:
|
|
|
|
|
|
```go
|
|
|
func CreateArticle(x *vigo.X, req *ArticleReq) (*Article, error) {
|
|
|
userID := cfg.Auth.UserID(x)
|
|
|
|
|
|
article := &Article{Title: req.Title, AuthorID: userID}
|
|
|
cfg.DB().Create(article)
|
|
|
|
|
|
// 授予用户对该文章的管理员权限 (Level 7)
|
|
|
permID := "article:" + article.ID
|
|
|
cfg.Auth.Grant(x.Context(), userID, permID, auth.LevelAdmin)
|
|
|
|
|
|
return article, nil
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 3.4 多 Scope 权限隔离
|
|
|
|
|
|
不同业务模块通过 Scope 实现权限隔离:
|
|
|
|
|
|
```go
|
|
|
// 为不同应用创建独立的 Provider
|
|
|
var AppA_Auth = auth.Factory.New("app_a")
|
|
|
var AppB_Auth = auth.Factory.New("app_b")
|
|
|
|
|
|
// AppA 的用户权限不会影响 AppB
|
|
|
```
|
|
|
|
|
|
## 4. Session 管理
|
|
|
|
|
|
VBase 使用 Session + JWT 双 Token 机制:
|
|
|
|
|
|
- **Access Token**:短期有效(默认 15 分钟),用于 API 认证
|
|
|
- **Refresh Token**:长期有效(默认 30 天),用于刷新 Access Token
|
|
|
- **Session**:记录登录设备信息和 IP,支持版本号轮换防止并发刷新互踢
|
|
|
|
|
|
Token 默认通过 HttpOnly Cookie 传送。Session 可通过 `auth.RevokeSession`、`auth.RevokeOtherSessions`、`auth.RevokeAllSessions` 管理。
|
|
|
|
|
|
## 5. 配置说明
|
|
|
|
|
|
VBase 默认使用 SQLite 内存数据库(`/tmp/vbase.db`),无需任何外部依赖即可运行。
|
|
|
|
|
|
配置文件示例(`config.yaml`):
|
|
|
|
|
|
```yaml
|
|
|
db:
|
|
|
type: "sqlite"
|
|
|
dsn: "/tmp/vbase.db"
|
|
|
|
|
|
redis:
|
|
|
addr: "memory"
|
|
|
|
|
|
key: "your-secret-key-min-32-characters"
|
|
|
|
|
|
jwt:
|
|
|
access_expiry: 900
|
|
|
refresh_expiry: 2592000
|
|
|
issuer: "vbase"
|
|
|
cookie_prefix: "vb_"
|
|
|
```
|
|
|
|
|
|
更多配置详情请参考 [配置文档](./configuration.md)。
|