Skip to content

RBAC

❗ 权限只控制“是否能做”,不控制“怎么做”

{domain}:{resource}:{action}

requirePermission

ts
type Permission = {
  key: string
  name: string
  module?: string
}

export const Permissions = {
  USER_CREATE: {
    key: "user:create",
    name: "创建用户",
    module: "user",
  },
}

requirePermission(Permissions.USER_CREATE)
go

type Permission struct {
    Key  string
    Name string
}

var (
    UserCreate = Permission{"user:create", "创建用户"}
    UserDelete = Permission{"user:delete", "删除用户"}
)
 
RequirePermission(UserCreate)


func RequirePermission(p Permission) gin.HandlerFunc {
    return func(c *gin.Context) {
        user := c.MustGet("user").(User)

        if !contains(user.Permissions, p.Key) {
            c.JSON(403, gin.H{"msg": "forbidden"})
            c.Abort()
            return
        }

        c.Next()
    }
}

scope

ts
const scopeHandlers = {
  self: (query, user) =>
    query.where("creator_id", user.id),

  dept: (query, user) =>
    query.where("dept_id", user.deptId),

  all: (query) =>
    query
}

function applyScope(query, permission, user) {
  const scope = getScope(user, permission)

  const handler = scopeHandlers[scope]

  return handler ? handler(query, user) : query
}