casbin-3
在设计基于 Casbin 的 API 时,可以参考以下几点:
模块化设计:
- 用户管理:用户与角色的绑定与解除。
- 角色管理:角色权限的增删改查。
- 权限校验:实时验证用户的访问权限。
- 策略管理:直接操作策略的增删改查。
接口定义:
- RESTful API 风格,分为多个资源:
/users: 用户相关接口。/roles: 角色相关接口。/permissions: 权限相关接口。
- RESTful API 风格,分为多个资源:
功能范围:
- 用户和角色关联。
- 角色与权限的定义。
- 动态添加或移除权限策略。
- 检查某个用户对资源的访问权限。
API 示例设计
1. 用户管理
| HTTP 方法 | 路径 | 描述 | 请求示例 |
|---|---|---|---|
GET | /users/:id/roles | 获取用户的所有角色 | /users/1/roles |
POST | /users/:id/roles | 为用户分配角色 | { "roles": ["admin", "editor"] } |
DELETE | /users/:id/roles | 移除用户的某些角色 | { "roles": ["editor"] } |
2. 角色管理
| HTTP 方法 | 路径 | 描述 | 请求示例 |
|---|---|---|---|
GET | /roles | 获取所有角色 | /roles |
POST | /roles | 创建新角色 | { "name": "editor", "description": "Can edit content" } |
DELETE | /roles/:name | 删除角色 | /roles/editor |
GET | /roles/:name/permissions | 获取角色的权限 | /roles/admin/permissions |
3. 权限管理
| HTTP 方法 | 路径 | 描述 | 请求示例 |
|---|---|---|---|
POST | /permissions | 添加权限策略 | { "subject": "admin", "object": "/api/users", "action": "GET" } |
DELETE | /permissions | 删除权限策略 | { "subject": "admin", "object": "/api/users", "action": "GET" } |
GET | /permissions | 获取所有权限策略 | /permissions |
4. 权限校验
| HTTP 方法 | 路径 | 描述 | 请求示例 |
|---|---|---|---|
POST | /auth/check | 校验用户是否有权限访问某资源 | { "subject": "alice", "object": "/api/users", "action": "GET" } |
后端实现(Go 示例)
1. 初始化 Casbin
go
package main
import (
"github.com/casbin/casbin/v2"
"github.com/casbin/gorm-adapter/v3"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func InitCasbin() (*casbin.Enforcer, error) {
db, _ := gorm.Open(sqlite.Open("casbin.db"), &gorm.Config{})
adapter, _ := gormadapter.NewAdapterByDB(db)
enforcer, _ := casbin.NewEnforcer("rbac_model.conf", adapter)
return enforcer, nil
}2. 示例 API
使用 Go 和 Gin 作为框架:
go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
enforcer, _ := InitCasbin()
r := gin.Default()
// 获取用户的角色
r.GET("/users/:id/roles", func(c *gin.Context) {
userID := c.Param("id")
roles := enforcer.GetRolesForUser(userID)
c.JSON(http.StatusOK, gin.H{"roles": roles})
})
// 为用户分配角色
r.POST("/users/:id/roles", func(c *gin.Context) {
userID := c.Param("id")
var req struct {
Roles []string `json:"roles"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
for _, role := range req.Roles {
enforcer.AddGroupingPolicy(userID, role)
}
c.JSON(http.StatusOK, gin.H{"message": "roles added"})
})
// 权限校验
r.POST("/auth/check", func(c *gin.Context) {
var req struct {
Subject string `json:"subject"`
Object string `json:"object"`
Action string `json:"action"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
ok, _ := enforcer.Enforce(req.Subject, req.Object, req.Action)
c.JSON(http.StatusOK, gin.H{"allowed": ok})
})
r.Run(":8080")
}优点
- 模块化清晰:用户、角色、权限分开管理,逻辑清晰。
- 灵活扩展:可以轻松扩展更多权限相关功能。
- Casbin 统一校验:利用 Casbin 的 Enforce 方法,快速验证权限。
扩展功能
- 权限缓存:为频繁校验的权限添加缓存机制,提高性能。
- 操作日志:记录权限分配和校验的操作日志。
- API 文档:结合 Swagger 自动生成接口文档。
这种设计可以满足大多数基于角色的权限管理需求,同时方便集成和扩展。