Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战
使用Golang原生功能实现用户注册与登录,包含路由设计、表单处理、bcrypt密码哈希、SQLite存储及基于Cookie的Session管理,适合学习但生产环境需结合Redis与HTTPS增强安全。

用户注册与登录是大多数Web服务的基础功能。使用Golang实现这一功能并不复杂,关键在于合理设计路由、处理表单数据、安全存储密码以及管理会话。下面通过一个简单的实战项目,展示如何用原生Golang(不依赖框架)完成基础的用户注册与登录。
1. 项目结构与初始化
创建项目目录,例如 user-auth,结构如下:
├── main.go├── handlers/
│ ├── auth.go
├── models/
│ ├── user.go
├── templates/
│ ├── register.html
│ ├── login.html
│ └── profile.html
└── db/ └── db.go
使用Go Modules初始化:
go mod init user-auth2. 数据库与用户模型设计
使用SQLite作为轻量数据库存储用户信息。在 db/db.go 中初始化数据库连接:
package db import ( "database/sql" _ "github.com/mattn/go-sqlite3" ) var DB *sql.DB func InitDB() (*sql.DB, error) { db, err := sql.Open("sqlite3", "./users.db") if err != nil { return nil, err } DB = db createTable() return db, nil } func createTable() { query := `CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL )` DB.Exec(query) }在 models/user.go 定义用户结构体:
package models type User struct { ID int Username string Password string }3. 密码安全:哈希存储
永远不要明文存储密码。使用Go标准库中的 golang.org/x/crypto/bcrypt 进行哈希处理。
安装bcrypt:
go get golang.org/x/crypto/bcrypt在注册时对密码进行哈希:
vue-store*小米商城
本项目前后端分离,前端基于Vue+Vue-router+Vuex+Element-ui+Axios,参考小米商城实现。后端基于Node.js(Koa框架)+Mysql实现。前端包含了11个页面:首页、登录、注册、全部商品、商品详情页、关于我们、我的收藏、购物车、订单结算页面、我的订单以及错误处理页面。实现了商品的展示、商品分类查询、关键字搜索商品、商品详细信息展示、登录、注册、用户购物车、订单结算
1
查看详情
import "golang.org/x/crypto/bcrypt"
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}
func CheckPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
4. 注册功能实现
在 handlers/auth.go 中编写注册逻辑:
package
handlers
import (
"net/http"
"html/template"
"user-auth/models"
"user-auth/db"
)
func Register(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
tmpl := template.Must(template.ParseFiles("templates/register.html"))
tmpl.Execute(w, nil)
return
}
username := r.FormValue("username")
password := r.FormValue("password")
hashedPassword, _ := HashPassword(password)
stmt, err := db.DB.Prepare("INSERT INTO users(username, password) VALUES(?, ?)")
if err != nil {
http.Error(w, "注册失败", 500)
return
}
defer stmt.Close()
_, err = stmt.Exec(username, hashedPassword)
if err != nil {
http.Error(w, "用户名已存在", 400)
return
}
http.Redirect(w, r, "/login", http.StatusSeeOther)
}
5. 登录与Session管理
使用Cookie实现简单Session。登录成功后设置一个session token。
var sessions = make(map[string]string) // 简单内存存储,生产环境应使用Redis等 func Login(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { tmpl := template.Must(template.ParseFiles("templates/login.html")) tmpl.Execute(w, nil) return } username := r.FormValue("username") password := r.FormValue("password") var user models.User err := db.DB.QueryRow("SELECT username, password FROM users WHERE username = ?", username). Scan(&user.Username, &user.Password) if err != nil || !CheckPasswordHash(password, user.Password) { http.Error(w, "用户名或密码错误", 401) return } // 创建Session sessionID := generateSessionID() // 可用uuid或简单随机字符串 sessions[sessionID] = username http.SetCookie(w, &http.Cookie{ Name: "session_id", Value: sessionID, Path: "/", }) http.Redirect(w, r, "/profile", http.StatusSeeOther) }6. 用户个人页面与身份验证
保护需要登录才能访问的页面,例如用户个人页:
func Profile(w http.ResponseWriter, r *http.Request) { cookie, err := r.Cookie("session_id") if err != nil || sessions[cookie.Value] == "" { http.Redirect(w, r, "/login", http.StatusSeeOther) return } username := sessions[cookie.Value] tmpl := template.Must(template.ParseFiles("templates/profile.html")) tmpl.Execute(w, username) }templates/profile.html 示例:
欢迎,{{.}}!
退出7. 退出登录
清除Session和Cookie:
func Logout(w http.ResponseWriter, r *http.Request) { cookie, err := r.Cookie("session_id") if err == nil { delete(sessions, cookie.Value) } http.SetCookie(w, &http.Cookie{ Name: "session_id", Value: "", Path: "/", MaxAge: -1, }) http.Redirect(w, r, "/login", http.StatusSeeOther) }8. 路由注册(main.go)
package main import ( "net/http" "user-auth/handlers" "user-auth/db" ) func main() { db.InitDB() defer db.DB.Close() http.HandleFunc("/register", handlers.Register) http.HandleFunc("/login", handlers.Login) http.HandleFunc("/profile", handlers.Profile) http.HandleFunc("/logout", handlers.Logout) http.ListenAndServe(":8080", nil) }运行项目:go run main.go,访问 http://localhost:8080/register 开始测试。
基本上就这些。这个小项目涵盖了注册、登录、密码哈希、Session管理等核心要点。虽然用了内存存储Session,适合学习,实际生产建议结合Redis和HTTPS来提升安全性。
以上就是Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战的详细内容,更多请关注其它相关文章!
