成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go項目實戰-注冊、登錄、登出與用戶Token體系的功能整合

開發 項目管理
即然要把用戶登錄相關的行為與Token體系整合到一起,我們得先有用戶才行,我們先來把用戶注冊的功能搞定。其實注冊功能的邏輯沒有什么值得大說特說的,唯一一個值得探究的是怎么保證用戶的密碼安全。

前面我們用三篇教程詳述了一個企業級用戶認證體系的設計與實現,其中主要功能:用戶Token的生成、驗證和刷新都已經實現了,現在是時候把Token認證和我們的用戶結合到一起啦。

用戶和Token有以下結合點:

  • 用戶登錄成功后,生成Token給用戶客戶端下發Token串。
  • 用戶退出登錄,把用戶登出平臺(Platform) 對應的Token和UserSession主動清除掉。
  • 用戶修改密碼,用戶在服務端的所有Token和UserSession全部清除掉,強制用戶在每個平臺重新登錄。

這些用戶行為的邏輯實現都對應著對Token和UserSession的不同操作,所以這也是為什么我在專欄的章節安排和代碼開發進度上先建設用戶認證體系再來做用戶注冊登錄等功能的原因。

本節我們來實現用戶注冊、登錄、登出的功能。

圖片圖片

注冊功能

即然要把用戶登錄相關的行為與Token體系整合到一起,我們得先有用戶才行,我們先來把用戶注冊的功能搞定。其實注冊功能的邏輯沒有什么值得大說特說的,唯一一個值得探究的是怎么保證用戶的密碼安全。

用戶密碼安全怎么保證

保證密碼安全有兩個方向

  • 用戶的密碼輸入不能太隨意、太容易讓別人蒙對,必須對其長度、復雜度進行限制。
  • 用戶的密碼在服務端必須是加密存儲的。

第一點比較好理解,我們對用戶密碼的長度、構成元素(大小寫、數字、特殊符號)都要有一定的要求。 第二點關于用戶密碼的加密存儲,我早期工作的幾家公司,有用md5的sha1的,還有他倆一起用的,一般還會再加個鹽(salt) 再進行md5、sha1。

而最近工作的兩家公司,用戶密碼是用的 bcryt 。 那這里我們探討一下到底應該用哪種?這里先說答案哈,用bcrypt。

md5,sha1,bcrypt 它們都叫做哈希算法,就是把明文變成哈希字符串的算法,不過他們還有小分類。md5、sha1 這些是快速哈希算法,而bcrypt是慢速哈希算法。 什么意思呢?

意思是如果你不停地堆CPU,快速哈希算法的哈希速度也會成倍增長,可以簡單地理解成以前雙核CPU執行哈希一個字符串的任務要花費一秒,變成四核CPU后就要花0.5s了。

而對慢速哈希來說,如果你不停地堆CPU,它執行哈希的速度也會變快,但快的非常有限,雙核變四核,速度也就從 1s 變0.9s這種級別的提升。

上面舉例的數據是我為了大家好理解自己編的,快速哈希和慢速哈希大概就是上面這個意思。所以數據庫中使用bcrypt這種慢速哈希的密碼,即使是數據庫數據被盜,想要通過撞庫的方式破解用戶的密碼,比使用md5、sha1哈希后的密碼難度和成本要高很多。

Bcypt 哈希后的字符串構成如下:

圖片圖片

  • Prefix說明了使用的bcrypt的版本
  • Cost是進行哈希的次數-數字越大生成bcrypt的速度越慢,成本越大。同樣也意味著如果密碼庫被盜,攻擊者想通過暴力破解的方法猜測出用戶密碼的成本變得越昂貴。
  • Salt是添加到要進行哈希的字符串中的隨機字符(21.25個字符),所以使用bcrypt時不需要我們在表里單獨存儲Salt。
  • Hashed Text是明文字符串最終被bcrypt應用這些設置哈希后的哈希文本。

搞清楚用戶密碼使用bcrypt加密的原因后,我們先把會用到的工具函數寫好,在 common/util 目錄下新建 password.go。 搞清楚用戶密碼使用bcrypt加密的原因后,我們先把會用到的工具函數寫好,在 common/util 目錄下新建  password.go。

Go語言里通過 "golang.org/x/crypto/bcrypt"支持了bcrypt算法的操作,我們把用到的方法封裝到下面的工具函數中。

package util

import (
 "golang.org/x/crypto/bcrypt"
 "unicode"
)

func BcryptPassword(plainPassword string) (string, error) {
 bytes, err := bcrypt.GenerateFromPassword([]byte(plainPassword), 11)
 return string(bytes), err
}

func BcryptCompare(passwordHash, plainPassword string) bool {
 err := bcrypt.CompareHashAndPassword([]byte(passwordHash), []byte(plainPassword))
 return err == nil
}

bcrypt.GenerateFromPassword中第二個參數 Cost 越大,速度越慢,在這里我設成了11,大家可以自己調整。

bcrypt.CompareHashAndPassword 這個方法能幫我們比對哈希字符串的原串和給定的明文字符串是否相等。如果不相等會報一個類似這樣的錯誤:

crypto/bcrypt: hashedPassword is not the hash of the given password

我們登錄功能時直接用這個方法就能驗證用戶密碼對不對。

繼續在password.go里添加驗證用戶密碼復雜度的工具函數

func PasswordComplexityVerify(s string) bool {
 var (
  hasMinLen  = false
  hasUpper   = false
  hasLower   = false
  hasNumber  = false
  hasSpecial = false
 )
 if len(s) >= 8 {
  hasMinLen = true
 }
 for _, char := range s {
  switch {
  case unicode.IsUpper(char):
   hasUpper = true
  case unicode.IsLower(char):
   hasLower = true
  case unicode.IsNumber(char):
   hasNumber = true
  case unicode.IsPunct(char) || unicode.IsSymbol(char):
   hasSpecial = true
  }
 }
 return hasMinLen && hasUpper && hasLower && hasNumber && hasSpecial
}

這個函數會檢查密碼的長度、大小寫、數字、特殊符號這些元素是不是都符合要求,實現注冊邏輯的時候我們直接調用即可。

下面我們開始實現注冊功能啦,在實現前我們再默念一遍邏輯分層的口訣

請求驗證和數據綁定邏輯 --- Controller

外圍業務邏輯 --- 應用服務

核心業務邏輯 --- 領域服務

數據訪問邏輯 --- 數據訪問層

第三方對接 -- Library(這個本節用不到)

 本節剩余內容和詳細的代碼實現,可在加入項目后訪問 https://github.com/go-study-lab/go-mall/compare/c11...c12 就能看本章節的詳細代碼。

圖片圖片

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2025-04-25 08:30:00

前端后端用戶登錄

2024-12-30 09:12:17

2025-01-02 09:02:09

Go項目Token

2025-01-08 09:07:06

2025-02-10 09:03:29

2025-03-10 09:07:20

2025-02-26 09:03:24

2024-11-28 09:51:35

SQL日志Go項目

2025-06-23 04:00:00

接口SpringToken

2025-06-05 02:22:00

2016-12-29 10:32:06

2024-01-12 18:26:44

2025-03-19 08:36:55

2024-11-13 09:13:45

2022-07-29 08:12:38

業務線賬號體系身份標識

2025-04-28 01:55:00

工具sqlmockSQL

2025-05-07 08:00:00

刷新令牌自動續簽FastAPI

2025-02-17 09:32:18

2025-03-07 09:01:14

商品模塊接口項目

2018-02-23 14:13:39

前端Cookie用戶登錄
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美在线 | 欧美国产日韩在线观看 | 丁香婷婷久久久综合精品国产 | 日本久久久久久 | 国产精品久久久久久久模特 | 青青久在线视频 | 天天夜夜人人 | 午夜在线视频 | 精品欧美视频 | 欧美日韩亚洲二区 | 欧美日韩一区二区三区在线观看 | 影音先锋欧美资源 | 成人精品国产免费网站 | 日本在线播放一区二区 | 欧美极品在线 | 国产精品久久二区 | 午夜国产精品视频 | 在线视频91 | 久久日韩粉嫩一区二区三区 | 欧美一区二区久久 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 欧美综合久久 | 激情一区二区三区 | www免费视频 | 高清亚洲| 欧洲视频一区 | 日韩欧美一区二区三区四区 | 亚洲欧美日韩电影 | 国产中的精品av涩差av | 国产日韩欧美一区 | 国产福利91精品 | 超碰8 | 国产精品色 | 一区二区三区四区av | 久久精品视频91 | 黄色国产在线播放 | 91久久精品一区二区二区 | 狠狠干2020 | 欧美日韩在线成人 | 男女精品网站 | 人人干人人干人人干 |