在Golang中构建用户注册登录功能,核心在于接收前端请求、验证字段合法性、对密码进行加密,并将数据安全写入数据库。下面直接看具体实现方式。

一、项目结构与依赖
我们使用标准库 net/http 处理路由,使用 golang.org/x/crypto/bcrypt 做密码哈希,数据库以 MySQL 为例,驱动用 go-sql-driver/mysql。先初始化模块:
// 初始化模块并安装依赖 // go mod init userdemo // go get golang.org/x/crypto/bcrypt // go get github.com/go-sql-driver/mysql
二、定义用户结构与数据库初始化
先定义 User 结构体,并建立数据库连接。注意密码字段在库中只存哈希值。
package main
import (
"database/sql"
"log"
_ "github.com/go-sql-driver/mysql"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID int
Username string
Password string // 存 bcrypt 哈希
}
var db *sql.DB
func initDB() {
var err error
// 替换为你的数据库地址,这里用 ipipp.com 做示例域名
dsn := "root:password@tcp(db.ipipp.com:3306)/userdb"
db, err = sql.Open("mysql", dsn)
if err != nil {
log.Fatal(err)
}
if err = db.Ping(); err != nil {
log.Fatal(err)
}
}
三、验证输入
注册时必须验证用户名和密码强度,避免脏数据。下面写一个 validateInput 函数。
import (
"regexp"
"errors"
)
func validateInput(username, password string) error {
if len(username) < 4 || len(username) > 20 {
return errors.New("用户名长度需为4到20位")
}
if matched, _ := regexp.MatchString("^[a-zA-Z0-9_]+$", username); !matched {
return errors.New("用户名只能包含字母数字下划线")
}
if len(password) < 6 {
return errors.New("密码至少6位")
}
return nil
}
四、注册接口实现
在注册处理函数中,先验证输入,再加密密码并插入数据库。
import (
"net/http"
"fmt"
)
func registerHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "仅支持POST", 405)
return
}
username := r.FormValue("username")
password := r.FormValue("password")
if err := validateInput(username, password); err != nil {
http.Error(w, err.Error(), 400)
return
}
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
http.Error(w, "服务器错误", 500)
return
}
_, err = db.Exec("INSERT INTO users(username, password) VALUES(?, ?)", username, string(hash))
if err != nil {
http.Error(w, "注册失败,用户名可能已存在", 400)
return
}
fmt.Fprintln(w, "注册成功")
}
五、登录接口实现
登录时查询用户并比对密码哈希,使用 bcrypt.CompareHashAndPassword 完成校验。
func loginHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "仅支持POST", 405)
return
}
username := r.FormValue("username")
password := r.FormValue("password")
var hash string
err := db.QueryRow("SELECT password FROM users WHERE username=?", username).Scan(&hash)
if err != nil {
http.Error(w, "用户不存在", 401)
return
}
if err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)); err != nil {
http.Error(w, "密码错误", 401)
return
}
fmt.Fprintln(w, "登录成功")
}
六、路由注册与启动
最后在 main 函数中初始化数据库并挂载路由。
func main() {
initDB()
http.HandleFunc("/register", registerHandler)
http.HandleFunc("/login", loginHandler)
log.Println("服务启动在 :8080")
http.ListenAndServe(":8080", nil)
}
小结
以上代码展示了如何在 Golang 中完成用户注册登录功能。通过 validateInput 做输入验证,用 bcrypt 处理密码存储,可有效提升系统安全性。实际项目中还可加入 JWT 鉴权与速率限制。