You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2.5 KiB

用户模型

GORM 模型定义

package model

import (
	"time"

	"gorm.io/gorm"
)

type User struct {
	ID        int64          `gorm:"primaryKey" json:"id"`
	UserType  string         `gorm:"default:'casdoor'" json:"user_type"` // casdoor/local
	Username  string         `gorm:"uniqueIndex;size:64" json:"username"`
	Password  string         `gorm:"size:128" json:"-"` // Casdoor 用户为空
	Email     string         `gorm:"size:128" json:"email"`
	Avatar    string         `gorm:"size:256" json:"avatar"`
	Role      string         `gorm:"default:'member'" json:"role"`
	Status    int            `gorm:"default:1" json:"status"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}

混合用户模式

如果需要支持本地管理员 + Casdoor 用户,可以扩展模型:

type User struct {
	ID         int64          `gorm:"primaryKey" json:"id"`
	UserType   string         `gorm:"default:'casdoor'" json:"user_type"` // casdoor/local/federation
	CasdoorID  string         `gorm:"size:64" json:"casdoor_id,omitempty"` // Casdoor 用户 ID
	ExternalID string         `gorm:"size:64" json:"external_id,omitempty"` // 外部系统 ID
	Source     string         `gorm:"size:64" json:"source,omitempty"` // 来源系统
	Username   string         `gorm:"uniqueIndex;size:64" json:"username"`
	Password   string         `gorm:"size:128" json:"-"`
	Email      string         `gorm:"size:128" json:"email"`
	Avatar     string         `gorm:"size:256" json:"avatar"`
	Role       string         `gorm:"default:'member'" json:"role"`
	Status     int            `gorm:"default:1" json:"status"`
	CreatedAt  time.Time      `json:"created_at"`
	UpdatedAt  time.Time      `json:"updated_at"`
	DeletedAt  gorm.DeletedAt `gorm:"index" json:"-"`
}

用户类型说明

UserType 说明 密码存储
local 本地管理员,在数据库中管理 本地加密存储
casdoor Casdoor 用户,SSO 登录 空(Casdoor 管理)
federation 联邦用户,来自第三方系统 空(源系统管理)

自动迁移

func NewServiceContext(c config.Config) *ServiceContext {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=true",
		c.MySQL.Username, c.MySQL.Password, c.MySQL.Host, c.MySQL.Port, c.MySQL.Database)

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	// 自动创建表
	db.AutoMigrate(&model.User{})

	return &ServiceContext{DB: db}
}