Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战

12次阅读

使用golang原生功能实现用户注册与登录,包含路由设计、表单处理、bcrypt密码哈希、sqlite存储及基于cookiesession管理,适合学习但生产环境需结合redishttpS增强安全。

Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战

用户注册与登录是大多数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-auth

2. 数据库与用户模型设计

使用sqlite作为轻量数据库存储用户信息。在 db/db.go 中初始化数据库连接:

立即学习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

在注册时对密码进行哈希:

Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战

ViiTor实时翻译

ai实时多语言翻译专家!强大的语音识别、AR翻译功能。

Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战 116

查看详情 Golang如何实现基础的用户注册与登录_Golang用户注册登录项目实战

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 示例:

<h1>欢迎,{{.}}!</h1> <a href=”/logout”>退出</a>

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来提升安全性。

text=ZqhQzanResources