ljw 1 год назад
Родитель
Сommit
70a03f1aba
3 измененных файлов с 24 добавлено и 8 удалено
  1. 3 1
      http/middleware/admin.go
  2. 4 1
      http/middleware/rustauth.go
  3. 17 6
      service/user.go

+ 3 - 1
http/middleware/admin.go

@@ -17,7 +17,7 @@ func AdminAuth() gin.HandlerFunc {
17 17
 			c.Abort()
18 18
 			return
19 19
 		}
20
-		user := service.AllService.UserService.InfoByAccessToken(token)
20
+		user, ut := service.AllService.UserService.InfoByAccessToken(token)
21 21
 		if user.Id == 0 {
22 22
 			response.Fail(c, 403, "请先登录")
23 23
 			c.Abort()
@@ -26,6 +26,8 @@ func AdminAuth() gin.HandlerFunc {
26 26
 
27 27
 		c.Set("curUser", user)
28 28
 		c.Set("token", token)
29
+		//如果时间小于1天,token自动续期
30
+		service.AllService.UserService.AutoRefreshAccessToken(ut)
29 31
 
30 32
 		c.Next()
31 33
 	}

+ 4 - 1
http/middleware/rustauth.go

@@ -28,7 +28,7 @@ func RustAuth() gin.HandlerFunc {
28 28
 		//这里只是简单的提取
29 29
 		token = token[7:]
30 30
 		//验证token
31
-		user := service.AllService.UserService.InfoByAccessToken(token)
31
+		user, ut := service.AllService.UserService.InfoByAccessToken(token)
32 32
 		if user.Id == 0 {
33 33
 			c.JSON(401, gin.H{
34 34
 				"error": "Unauthorized",
@@ -46,6 +46,9 @@ func RustAuth() gin.HandlerFunc {
46 46
 
47 47
 		c.Set("curUser", user)
48 48
 		c.Set("token", token)
49
+
50
+		service.AllService.UserService.AutoRefreshAccessToken(ut)
51
+
49 52
 		c.Next()
50 53
 	}
51 54
 }

+ 17 - 6
service/user.go

@@ -53,18 +53,18 @@ func (us *UserService) InfoByUsernamePassword(username, password string) *model.
53 53
 }
54 54
 
55 55
 // InfoByAccesstoken 根据accesstoken取用户信息
56
-func (us *UserService) InfoByAccessToken(token string) *model.User {
56
+func (us *UserService) InfoByAccessToken(token string) (*model.User, *model.UserToken) {
57 57
 	u := &model.User{}
58 58
 	ut := &model.UserToken{}
59 59
 	global.DB.Where("token = ?", token).First(ut)
60 60
 	if ut.Id == 0 {
61
-		return u
61
+		return u, ut
62 62
 	}
63 63
 	if ut.ExpiredAt < time.Now().Unix() {
64
-		return u
64
+		return u, ut
65 65
 	}
66 66
 	global.DB.Where("id = ?", ut.UserId).First(u)
67
-	return u
67
+	return u, ut
68 68
 }
69 69
 
70 70
 // GenerateToken 生成token
@@ -217,8 +217,9 @@ func (us *UserService) Delete(u *model.User) error {
217 217
 	}
218 218
 	tx.Commit()
219 219
 	// 删除关联的peer
220
-	return AllService.PeerService.EraseUserId(u.Id); err != nil {
221
-		return errors.New("User deleted successfully, but failed to unlink peer.")
220
+	if err := AllService.PeerService.EraseUserId(u.Id); err != nil {
221
+		global.Logger.Warn("User deleted successfully, but failed to unlink peer.")
222
+		return nil
222 223
 	}
223 224
 	return nil
224 225
 }
@@ -447,3 +448,13 @@ func (us *UserService) getAdminUserCount() int64 {
447 448
 	global.DB.Model(&model.User{}).Where("is_admin = ?", true).Count(&count)
448 449
 	return count
449 450
 }
451
+
452
+func (us *UserService) RefreshAccessToken(ut *model.UserToken) {
453
+	ut.ExpiredAt = time.Now().Add(time.Hour * 24 * 7).Unix()
454
+	global.DB.Model(ut).Update("expired_at", ut.ExpiredAt)
455
+}
456
+func (us *UserService) AutoRefreshAccessToken(ut *model.UserToken) {
457
+	if ut.ExpiredAt-time.Now().Unix() < 86400 {
458
+		us.RefreshAccessToken(ut)
459
+	}
460
+}