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
相关产品推荐
相关产品推荐

