user

package
v0.0.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2026 License: MIT Imports: 8 Imported by: 0

README

User 模块

概述

User 模块是 MProxy 的统一用户管理模块,负责所有代理服务的用户认证和权限控制。

职责

  • ✅ 用户认证(用户名/密码验证)
  • ✅ 用户生命周期管理(CRUD)
  • ✅ 权限控制(哪些代理服务可以访问)
  • ✅ 连接数限制(per user)
  • ✅ 用户状态管理(启用/禁用)

数据模型

mproxy_users 表
CREATE TABLE mproxy_users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(64) NOT NULL UNIQUE COMMENT '代理用户名',
    password_hash VARCHAR(256) NOT NULL COMMENT '密码哈希(bcrypt)',
    status ENUM('enabled', 'disabled') DEFAULT 'enabled' COMMENT '状态',
    max_connections INT DEFAULT 10 COMMENT '最大并发连接数',
    permissions JSON COMMENT '权限配置 {"rds": true, "ssh": false}',
    description VARCHAR(255) COMMENT '用户描述',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MProxy统一用户表';
permissions 字段说明
{
  "rds": true,      // 允许访问 RDS 代理
  "ssh": true,      // 允许访问 SSH 代理
  "redis": false,   // 禁止访问 Redis 代理
  "mongodb": false  // 禁止访问 MongoDB 代理
}

接口设计

核心接口
type Service interface {
    // 认证
    Authenticate(ctx context.Context, username, password string) (*User, error)
    
    // 查询
    GetUser(ctx context.Context, username string) (*User, error)
    ListUsers(ctx context.Context, req *ListRequest) (*UserSet, error)
    
    // 管理
    CreateUser(ctx context.Context, req *CreateRequest) (*User, error)
    UpdateUser(ctx context.Context, req *UpdateRequest) (*User, error)
    DeleteUser(ctx context.Context, username string) error
    
    // 权限检查
    HasPermission(ctx context.Context, username, service string) (bool, error)
}
User 模型
type User struct {
    Id              int64             `json:"id"`
    Username        string            `json:"username"`
    PasswordHash    string            `json:"-"`  // 不返回密码
    Status          string            `json:"status"`
    MaxConnections  int               `json:"max_connections"`
    Permissions     map[string]bool   `json:"permissions"`
    Description     string            `json:"description"`
    CreatedAt       time.Time         `json:"created_at"`
    UpdatedAt       time.Time         `json:"updated_at"`
}

使用场景

场景 1: 用户认证
// RDS 代理调用
user, err := userService.Authenticate(ctx, "app_developer", "password123")
if err != nil {
    return errors.New("认证失败")
}

// 检查 RDS 权限
hasAccess, _ := userService.HasPermission(ctx, user.Username, "rds")
if !hasAccess {
    return errors.New("无 RDS 访问权限")
}
场景 2: 创建用户
req := &CreateRequest{
    Username:       "new_user",
    Password:       "secure_password",
    MaxConnections: 20,
    Permissions: map[string]bool{
        "rds": true,
        "ssh": true,
    },
    Description: "新开发者账号",
}

user, err := userService.CreateUser(ctx, req)
场景 3: 权限管理
// 更新用户权限
req := &UpdateRequest{
    Username: "app_developer",
    Permissions: map[string]bool{
        "rds":   true,
        "redis": true,  // 新增 Redis 权限
    },
}

user, err := userService.UpdateUser(ctx, req)

API 端点

RESTful API
# 用户管理
GET    /api/mproxy/users              # 列表
GET    /api/mproxy/users/:username    # 详情
POST   /api/mproxy/users              # 创建
PUT    /api/mproxy/users/:username    # 更新
DELETE /api/mproxy/users/:username    # 删除

# 认证
POST   /api/mproxy/auth/verify        # 验证用户名密码
请求示例
# 创建用户
curl -X POST http://localhost:8080/api/mproxy/users \
  -H "Content-Type: application/json" \
  -d '{
    "username": "app_user",
    "password": "password123",
    "max_connections": 10,
    "permissions": {"rds": true, "ssh": false},
    "description": "应用用户"
  }'

# 查询用户
curl http://localhost:8080/api/mproxy/users/app_user

安全设计

1. 密码加密
  • 使用 bcrypt 加密存储
  • 加密强度:cost = 10
import "golang.org/x/crypto/bcrypt"

// 加密
hash, _ := bcrypt.GenerateFromPassword([]byte(password), 10)

// 验证
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
2. 防暴力破解
  • 同一用户 5 次失败后锁定 5 分钟
  • 记录失败日志用于审计
3. 密码强度要求
  • 最小长度 8 位
  • 必须包含数字和字母
  • 建议包含特殊字符

配置示例

[mproxy.user]
  # 元数据数据库配置
  [mproxy.user.db]
    host = "127.0.0.1"
    port = 3306
    username = "mproxy_admin"
    password = "admin_password"
    database = "mproxy_metadata"
    max_pool_size = 10
  
  # 密码策略
  [mproxy.user.password_policy]
    min_length = 8
    require_number = true
    require_letter = true
    require_special = false
  
  # 认证策略
  [mproxy.user.auth_policy]
    max_failed_attempts = 5
    lockout_duration = "5m"

依赖

  • golang.org/x/crypto/bcrypt - 密码加密
  • github.com/go-sql-driver/mysql - MySQL 驱动
  • github.com/infraboard/mcube/v2 - 基础框架

文件结构

user/
├── README.md           # 本文档
├── interface.go        # 接口定义
├── impl.go            # 实现
├── model.go           # 数据模型
├── api.go             # HTTP API
└── impl_test.go       # 单元测试

后续增强

  • OAuth2 集成
  • LDAP 认证
  • 双因素认证 (2FA)
  • 密码过期策略
  • 用户组管理

Documentation

Index

Constants

View Source
const (
	APP_NAME = "proxy_user"
)

Variables

This section is empty.

Functions

func NewUserSet

func NewUserSet() *types.Set[*User]

Types

type AuthenticateResponse

type AuthenticateResponse struct {
	Data   *User  `json:"data"`
	Token  string `json:"token,omitempty"`
	Expiry int64  `json:"expiry,omitempty"`
}

AuthenticateResponse 认证响应

type AuthenticateUserRequest

type AuthenticateUserRequest struct {
	Username string `json:"username" validate:"required"`
	Password string `json:"password" validate:"required"`
}

func (*AuthenticateUserRequest) Validate

func (r *AuthenticateUserRequest) Validate() error

type CreateUserRequest

type CreateUserRequest struct {
	// 用户名
	Username string `json:"username" validate:"required"`
	// 密码
	Password string `json:"password" validate:"required"`
	// 状态
	Status string `json:"status"`
	// 最大连接数
	MaxConnections int `json:"max_connections"`
	// 权限 {"service": true/false}
	Permissions map[string]bool `json:"permissions"`
	// 描述
	Description string `json:"description"`
}

func NewCreateUserRequest

func NewCreateUserRequest() *CreateUserRequest

func (*CreateUserRequest) SetDescription

func (r *CreateUserRequest) SetDescription(description string) *CreateUserRequest

func (*CreateUserRequest) SetMaxConnections

func (r *CreateUserRequest) SetMaxConnections(maxConnections int) *CreateUserRequest

func (*CreateUserRequest) SetPassword

func (r *CreateUserRequest) SetPassword(password string) *CreateUserRequest

func (*CreateUserRequest) SetPermission

func (r *CreateUserRequest) SetPermission(service string, allowed bool) *CreateUserRequest

func (*CreateUserRequest) SetStatus

func (r *CreateUserRequest) SetStatus(status string) *CreateUserRequest

func (*CreateUserRequest) SetUsername

func (r *CreateUserRequest) SetUsername(username string) *CreateUserRequest

func (*CreateUserRequest) Validate

func (r *CreateUserRequest) Validate() error

type DeleteUserRequest

type DeleteUserRequest struct {
	DescribeUserRequest
}

func NewDeleteUserRequest

func NewDeleteUserRequest(username string) *DeleteUserRequest

type DescribeUserRequest

type DescribeUserRequest struct {
	Username string `json:"username"`
}

func NewDescribeUserRequest

func NewDescribeUserRequest(username string) *DescribeUserRequest

type HasPermissionRequest

type HasPermissionRequest struct {
	Username string `json:"username" validate:"required"`
	Service  string `json:"service" validate:"required"`
}

func (*HasPermissionRequest) Validate

func (r *HasPermissionRequest) Validate() error

type QueryUserRequest

type QueryUserRequest struct {
	*request.PageRequest
	// 用户名,支持模糊查询
	Username string `json:"username"`
	// 状态过滤
	Status string `json:"status"`
}

func NewQueryUserRequest

func NewQueryUserRequest() *QueryUserRequest

type Service

type Service interface {
	// 创建用户
	CreateUser(context.Context, *CreateUserRequest) (*User, error)
	// 查询用户
	QueryUser(context.Context, *QueryUserRequest) (*types.Set[*User], error)
	// 获取用户详情
	DescribeUser(context.Context, *DescribeUserRequest) (*User, error)
	// 更新用户
	UpdateUser(context.Context, *UpdateUserRequest) (*User, error)
	// 删除用户
	DeleteUser(context.Context, *DeleteUserRequest) (*User, error)
	// 用户认证
	AuthenticateUser(context.Context, *AuthenticateUserRequest) (*User, error)
	// 检查权限
	HasPermission(context.Context, *HasPermissionRequest) (bool, error)
}

func GetService

func GetService() Service

type UpdateUserRequest

type UpdateUserRequest struct {
	Username       string          `json:"username" validate:"required"`
	Status         string          `json:"status"`
	MaxConnections int             `json:"max_connections"`
	Permissions    map[string]bool `json:"permissions"`
	Description    string          `json:"description"`
	UpdateBy       string          `json:"update_by"`
}

func (*UpdateUserRequest) Validate

func (r *UpdateUserRequest) Validate() error

type User

type User struct {
	// 用户ID (自增)
	Id int64 `json:"id" gorm:"column:id;primaryKey;autoIncrement"`
	// 创建时间
	CreateAt time.Time `json:"create_at" gorm:"column:create_at"`
	// 更新时间
	UpdateAt *time.Time `json:"update_at" gorm:"column:update_at"`
	// 更新人
	UpdateBy string `json:"update_by" gorm:"column:update_by;type:varchar(60)"`

	// 用户定义
	CreateUserRequest
	// 密码哈希值
	PasswordHash string `json:"-" gorm:"column:password_hash;type:varchar(255)"`
}

User 代理用户模型

func NewUser

func NewUser(req *CreateUserRequest) *User

func (*User) SetPassword

func (u *User) SetPassword(password string) error

SetPassword 设置密码并生成哈希值

func (*User) String

func (u *User) String() string

func (*User) TableName

func (u *User) TableName() string

func (*User) VerifyPassword

func (u *User) VerifyPassword(password string) bool

VerifyPassword 验证密码

type UserResponse

type UserResponse struct {
	Data *User `json:"data"`
}

UserResponse API响应格式

type UserSetResponse

type UserSetResponse struct {
	Data *types.Set[*User] `json:"data"`
}

UserSetResponse 列表响应

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL