You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang新手如何参照现有注册逻辑基于gorilla/mux实现三层架构用户登录

前置准备

确认你的model.User结构体包含用户名、密码字段,且注册逻辑中已将用户密码做哈希处理后入库,不要存储明文密码。


第一步:修改db_service.go 新增数据库查询方法

在现有db_service.go文件末尾添加如下代码,用于根据用户名查询对应用户:

import "go.mongodb.org/mongo-driver/bson"

// GetUserByUsername 根据用户名查询用户完整信息
func GetUserByUsername(username string) (*model.User, error) {
    collection := clientInstance.Database(AUTH_DB).Collection(USER_COLLECTION)
    var user model.User
    // 按用户名字段过滤查询
    err := collection.FindOne(context.TODO(), bson.M{"username": username}).Decode(&user)
    return &user, err
}

如果需要用邮箱登录,可自行修改查询条件为bson.M{"email": email}。


第二步:修改login_service.go 新增登录业务处理方法

在现有login_service.go文件中添加如下代码,处理密码校验、错误封装等业务逻辑:

import (
    "errors"
    "golang.org/x/crypto/bcrypt"
)

// Login_User 登录业务处理,返回脱敏后的用户信息和错误
func Login_User(loginReq *model.User) (*model.User, error) {
    // 1. 调用db层方法查询用户是否存在
    existUser, err := util.GetUserByUsername(loginReq.Username)
    if err != nil {
        // mongo返回ErrNoDocuments代表用户不存在,统一返回模糊提示避免被撞库
        return nil, errors.New("用户名或密码错误")
    }
    // 2. 比对输入密码和库中存储的哈希密码
    err = bcrypt.CompareHashAndPassword([]byte(existUser.Password), []byte(loginReq.Password))
    if err != nil {
        return nil, errors.New("用户名或密码错误")
    }
    // 3. 脱敏处理:清空返回结果的密码字段,避免泄露
    existUser.Password = ""
    // 可选扩展:这里可以添加JWT Token生成逻辑,返回Token给前端用于后续鉴权
    return existUser, nil
}

注意:你需要先安装bcrypt依赖:go get golang.org/x/crypto/bcrypt
注册逻辑存储密码前必须先做哈希处理,示例代码如下,加在Register_User方法入库前执行:

hashPwd, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
if err != nil {
    return nil, err
}
user.Password = string(hashPwd)

第三步:在login.go 新增登录HTTP接口处理方法

和现有注册接口逻辑对齐,添加如下代码处理HTTP请求:

func Login(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    // 解析登录请求参数
    var loginReq model.User
    if err := json.NewDecoder(r.Body).Decode(&loginReq); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    // 调用业务层登录方法
    userInfo, err := service.Login_User(&loginReq)
    if err != nil {
        if err.Error() == "用户名或密码错误" {
            w.WriteHeader(http.StatusUnauthorized)
        } else {
            w.WriteHeader(http.StatusInternalServerError)
        }
        _ = json.NewEncoder(w).Encode(map[string]string{"error": err.Error()})
        return
    }
    // 登录成功返回用户信息
    w.WriteHeader(http.StatusOK)
    _ = json.NewEncoder(w).Encode(userInfo)
}

内容的提问来源于stack exchange,提问作者user16580170

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:27:04