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

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

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

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

用戶和Token有以下結合點:

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

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

本節(jié)我們來實現(xiàn)用戶注冊、登錄、登出的功能。

圖片圖片

注冊功能

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

用戶密碼安全怎么保證

保證密碼安全有兩個方向

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

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

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

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

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

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

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

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

圖片圖片

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

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

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

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中第二個參數(shù) Cost 越大,速度越慢,在這里我設成了11,大家可以自己調(diào)整。

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

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

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

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

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
}

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

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

請求驗證和數(shù)據(jù)綁定邏輯 --- Controller

外圍業(yè)務邏輯 --- 應用服務

核心業(yè)務邏輯 --- 領域服務

數(shù)據(jù)訪問邏輯 --- 數(shù)據(jù)訪問層

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

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

圖片圖片

責任編輯:武曉燕 來源: 網(wǎng)管叨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

2024-11-28 09:51:35

SQL日志Go項目

2025-02-26 09:03:24

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

2022-07-29 08:12:38

業(yè)務線賬號體系身份標識

2025-05-07 08:00:00

刷新令牌自動續(xù)簽FastAPI

2024-11-13 09:13:45

2025-04-28 01:55:00

工具sqlmockSQL

2025-02-17 09:32:18

2025-03-07 09:01:14

商品模塊接口項目

2012-05-03 10:13:56

FlexSSHJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 丁香六月激情 | 国产福利91精品 | 欧美日韩一区不卡 | 成人福利在线 | 99久久久久久久 | jvid精品资源在线观看 | 国产成人综合亚洲欧美94在线 | 亚洲午夜av久久乱码 | 国产高清精品在线 | 色综合区| 欧美日韩在线观看视频网站 | 国产成人a亚洲精品 | 欧美性猛交一区二区三区精品 | 久久综合av | 99久久精品国产毛片 | 黄色免费在线观看 | 一区二区三区成人 | 国产精品成av人在线视午夜片 | 精品欧美乱码久久久久久 | 日韩视频一区在线观看 | 国产一级片久久久 | 亚洲播放一区 | 精品久久国产 | 欧美黄色一级毛片 | 日韩欧美综合 | 久久亚洲国产精品 | 啪一啪 | 91精品在线观看入口 | 99热这里有精品 | 国产在线精品免费 | 中文字幕成人av | 成人福利在线观看 | 成人在线视频免费观看 | 91国在线观看 | 成人午夜在线 | 国产一区高清 | 午夜a√| 黄网站免费在线观看 | 欧美一区二区三区在线视频 | 国产一区二区三区久久久久久久久 | 亚洲一区二区久久 |