使用JWT实现无状态认证,结合bcrypt密码加密和RBAC授权,通过中间件验证Token与角色权限,是Golang Web应用常见安全方案。

在使用Golang开发Web应用时,用户认证和授权是保障系统安全的核心环节。认证(Authentication)确认用户身份,授权(Authorization)决定用户能访问哪些资源。下面介绍几种常见且实用的实现方式。
JSON Web Token(JWT)是一种轻量级、自包含的身份验证机制,适合分布式系统。
基本流程:用户登录后,服务端生成一个JWT返回给客户端;之后每次请求携带该Token,服务端验证其有效性。
示例代码:安装依赖:
立即学习“go语言免费学习笔记(深入)”;
go get github.com/golang-jwt/jwt/v5
生成Token:
import "github.com/golang-jwt/jwt/v5"
<p>func generateToken(userID string) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
return token.SignedString([]byte("your-secret-key"))
}
中间件验证Token:
func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
tokenStr := r.Header.Get("Authorization")
if tokenStr == "" {
http.Error(w, "Missing token", http.StatusUnauthorized)
return
}
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"> token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
return []byte("your-secret-key"), nil
})
if err != nil || !token.Valid {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
next(w, r)
}}
授权通常通过角色来管理权限。例如:admin可删除数据,user只能查看。
可以在JWT中嵌入用户角色,或从数据库查询角色权限。
示例:扩展JWT Claims加入角色信息
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"user_id": "123",
"role": "admin",
"exp": time.Now().Add(time.Hour * 24).Unix(),
})
编写角色检查中间件:
func requireRole(requiredRole string) func(http.HandlerFunc) http.HandlerFunc {
return func(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
token, _ := jwt.ParseFromRequest(r, func(token *jwt.Token) (interface{}, error) {
return []byte("your-secret-key"), nil
})
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;"> if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
if claims["role"] == requiredRole {
next(w, r)
return
}
}
http.Error(w, "Forbidden", http.StatusForbidden)
}
}}
用户登录时需验证用户名和密码,通常使用bcrypt加密存储密码。
常用库:golang.org/x/crypto/bcrypt
示例:
import "golang.org/x/crypto/bcrypt"
<p>func hashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
return string(bytes), err
}</p><p>func checkPassword(hash, password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
登录处理函数中调用数据库查询用户并比对密码,成功后发放JWT。
对于需要接入微信、Google、GitHub等平台的应用,可使用OAuth2协议。
推荐库:golang.org/x/oauth2
配置OAuth2客户端,重定向用户到授权页,回调中获取access token和用户信息。
适用于减少密码管理负担,提升用户体验。
基本上就这些。JWT + bcrypt + 中间件控制是最常见的组合,简单有效,适合大多数中小型项目。安全起见,密钥应从环境变量读取,Token设置合理过期时间,并考虑刷新机制。不复杂但容易忽略细节。
以上就是Golang如何实现用户认证和授权_Golang 用户认证授权方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号