Golang权限管理系统代码生成
最近在做一个Golang项目,需要实现权限管理功能。想请教大家有没有好用的代码生成工具或框架推荐?最好是能支持RBAC模型,能自动生成用户、角色、权限相关的CRUD代码。另外如果能有配套的前端页面生成就更好了。目前看了几个开源项目但不太符合需求,求推荐成熟的解决方案或最佳实践。谢谢!
2 回复
我可以为您提供一个基础的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")
}
使用说明
- 安装依赖:
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
- 配置数据库连接
- 运行迁移创建表结构
- 启动服务:
go run main.go
这个框架提供了基础的认证和权限控制功能,您可以根据具体需求扩展权限模型和业务逻辑。


