Skip to content

casbin-3

在设计基于 Casbin 的 API 时,可以参考以下几点:

  1. 模块化设计

    • 用户管理:用户与角色的绑定与解除。
    • 角色管理:角色权限的增删改查。
    • 权限校验:实时验证用户的访问权限。
    • 策略管理:直接操作策略的增删改查。
  2. 接口定义

    • RESTful API 风格,分为多个资源:
      • /users: 用户相关接口。
      • /roles: 角色相关接口。
      • /permissions: 权限相关接口。
  3. 功能范围

    • 用户和角色关联。
    • 角色与权限的定义。
    • 动态添加或移除权限策略。
    • 检查某个用户对资源的访问权限。

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 方法,快速验证权限。

扩展功能

  1. 权限缓存:为频繁校验的权限添加缓存机制,提高性能。
  2. 操作日志:记录权限分配和校验的操作日志。
  3. API 文档:结合 Swagger 自动生成接口文档。

这种设计可以满足大多数基于角色的权限管理需求,同时方便集成和扩展。