Golang权限管理系统代码生成

最近在做一个Golang项目,需要实现权限管理功能。想请教大家有没有好用的代码生成工具或框架推荐?最好是能支持RBAC模型,能自动生成用户、角色、权限相关的CRUD代码。另外如果能有配套的前端页面生成就更好了。目前看了几个开源项目但不太符合需求,求推荐成熟的解决方案或最佳实践。谢谢!

2 回复

推荐使用Go语言框架如Gin或Beego,结合Casbin权限库,快速生成RBAC权限管理代码。可自动生成用户、角色、权限表及CRUD接口。建议使用代码生成工具如goctl或自定义模板。

更多关于Golang权限管理系统代码生成的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我可以为您提供一个基础的Golang权限管理系统的代码框架,包含用户认证和基于角色的权限控制。

项目结构

auth-system/
├── main.go
├── models/
│   ├── user.go
│   └── role.go
├── handlers/
│   ├── auth.go
│   └── user.go
├── middleware/
│   └── auth.go
└── database/
    └── db.go

核心代码

1. 数据模型 (models/user.go)

package models

import "gorm.io/gorm"

type User struct {
    gorm.Model
    Username string `gorm:"uniqueIndex" json:"username"`
    Password string `json:"-"`
    Email    string `gorm:"uniqueIndex" json:"email"`
    RoleID   uint   `json:"role_id"`
    Role     Role   `json:"role"`
}

type Role struct {
    gorm.Model
    Name        string `gorm:"uniqueIndex" json:"name"`
    Permissions string `json:"permissions"` // JSON格式存储权限列表
}

2. 认证中间件 (middleware/auth.go)

package middleware

import (
    "net/http"
    "strings"
    "your-project/models"
    "github.com/gin-gonic/gin"
    "github.com/golang-jwt/jwt/v4"
)

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        authHeader := c.GetHeader("Authorization")
        if authHeader == "" {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "未提供认证令牌"})
            c.Abort()
            return
        }

        tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
        claims := &jwt.MapClaims{}
        
        token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
            return []byte("your-secret-key"), nil
        })

        if err != nil || !token.Valid {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "无效令牌"})
            c.Abort()
            return
        }

        c.Set("userID", (*claims)["userID"])
        c.Next()
    }
}

func RoleMiddleware(requiredRole string) gin.HandlerFunc {
    return func(c *gin.Context) {
        userID, exists := c.Get("userID")
        if !exists {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "用户未认证"})
            c.Abort()
            return
        }

        var user models.User
        // 从数据库获取用户角色信息并验证权限
        // 这里需要实现具体的权限检查逻辑
        
        c.Next()
    }
}

3. 认证处理器 (handlers/auth.go)

package handlers

import (
    "net/http"
    "time"
    "your-project/models"
    "github.com/gin-gonic/gin"
    "github.com/golang-jwt/jwt/v4"
    "golang.org/x/crypto/bcrypt"
)

func Login(c *gin.Context) {
    var loginData struct {
        Username string `json:"username"`
        Password string `json:"password"`
    }

    if err := c.ShouldBindJSON(&loginData); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "无效的请求数据"})
        return
    }

    var user models.User
    // 从数据库查找用户
    // db.Where("username = ?", loginData.Username).First(&user)

    err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(loginData.Password))
    if err != nil {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
        return
    }

    // 生成JWT令牌
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "userID": user.ID,
        "exp":    time.Now().Add(time.Hour * 24).Unix(),
    })

    tokenString, err := token.SignedString([]byte("your-secret-key"))
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "生成令牌失败"})
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "token": tokenString,
        "user":  user,
    })
}

func Register(c *gin.Context) {
    var user models.User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": "无效的请求数据"})
        return
    }

    // 密码加密
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "密码加密失败"})
        return
    }
    user.Password = string(hashedPassword)

    // 保存到数据库
    // db.Create(&user)

    c.JSON(http.StatusCreated, gin.H{"message": "用户注册成功"})
}

4. 主程序 (main.go)

package main

import (
    "your-project/handlers"
    "your-project/middleware"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    // 公开路由
    r.POST("/register", handlers.Register)
    r.POST("/login", handlers.Login)

    // 需要认证的路由组
    auth := r.Group("/api")
    auth.Use(middleware.AuthMiddleware())
    {
        auth.GET("/profile", handlers.GetProfile)
        
        // 需要管理员权限的路由
        admin := auth.Group("/admin")
        admin.Use(middleware.RoleMiddleware("admin"))
        {
            admin.GET("/users", handlers.GetAllUsers)
        }
    }

    r.Run(":8080")
}

使用说明

  1. 安装依赖:
go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u github.com/golang-jwt/jwt/v4
go get -u golang.org/x/crypto/bcrypt
  1. 配置数据库连接
  2. 运行迁移创建表结构
  3. 启动服务:go run main.go

这个框架提供了基础的认证和权限控制功能,您可以根据具体需求扩展权限模型和业务逻辑。

回到顶部