zjxpcyc 6 gadus atpakaļ
vecāks
revīzija
e04e9b1087
6 mainītis faili ar 62 papildinājumiem un 10 dzēšanām
  1. 7
    1
      controllers/auth.go
  2. 3
    0
      controllers/user/user.go
  3. 2
    0
      models/model/sys_token_log.go
  4. 33
    1
      models/sys.go
  5. 11
    8
      service/sys.go
  6. 6
    0
      utils/jwt.go

+ 7
- 1
controllers/auth.go Parādīt failu

@@ -49,5 +49,11 @@ func (c *BaseController) SetTokenExipre(uid string) {
49 49
 
50 50
 // CreateNewToken 新 token
51 51
 func (c *BaseController) CreateNewToken() {
52
-	c.Context.Set("token", c.serv.NewToken())
52
+
53
+	batchNo := ""
54
+	if c.Context.Get("token-batch") != nil {
55
+		batchNo = c.Context.Get("token-batch").(string)
56
+	}
57
+
58
+	c.Context.Set("token", c.serv.NewToken(batchNo))
53 59
 }

+ 3
- 0
controllers/user/user.go Parādīt failu

@@ -9,6 +9,8 @@ import (
9 9
 	"spaceofcheng/services/service"
10 10
 	"spaceofcheng/services/utils"
11 11
 	"time"
12
+
13
+	"github.com/yl10/kit/guid"
12 14
 )
13 15
 
14 16
 // UserController 用户
@@ -185,6 +187,7 @@ func (c *UserController) SignIn() {
185 187
 
186 188
 	// 成功之后, 设置用户
187 189
 	c.Context.Set("user", *user)
190
+	c.Context.Set("token-batch", guid.NewGUIDString())
188 191
 
189 192
 	if token == "" && doRemember != 0 {
190 193
 		var err error

+ 2
- 0
models/model/sys_token_log.go Parādīt failu

@@ -8,4 +8,6 @@ type SysTokenLog struct {
8 8
 	Uid        string    `xorm:"VARCHAR(64)"`
9 9
 	Status     int       `xorm:"SMALLINT(6)"`
10 10
 	CreateDate time.Time `xorm:"DATETIME"`
11
+	ExpireDate time.Time `xorm:"DATETIME"`
12
+	BatchNo    string    `xorm:"VARCHAR(64)"`
11 13
 }

+ 33
- 1
models/sys.go Parādīt failu

@@ -3,6 +3,7 @@ package models
3 3
 import (
4 4
 	"errors"
5 5
 	"spaceofcheng/services/models/model"
6
+	"strings"
6 7
 	"time"
7 8
 
8 9
 	"github.com/yl10/kit/guid"
@@ -136,10 +137,12 @@ func GetWeChatConfig(org, cliType string) (*model.SysWechatConf, error) {
136 137
 }
137 138
 
138 139
 // InsertToken 插入 token 生成记录
139
-func InsertToken(token, uid string) error {
140
+func InsertToken(token, uid, batchNo string, expire time.Time) error {
140 141
 	tk := model.SysTokenLog{
141 142
 		Token:      token,
142 143
 		Uid:        uid,
144
+		BatchNo:    batchNo,
145
+		ExpireDate: expire,
143 146
 		Status:     STATUS_NORMAL,
144 147
 		CreateDate: time.Now().Local(),
145 148
 	}
@@ -157,6 +160,35 @@ func UpdateTokenExpire(token, uid string) error {
157 160
 		Status: STATUS_DEL,
158 161
 	}
159 162
 
163
+	// 检索相同批次
164
+	var tkLogs []model.SysTokenLog
165
+	if err := DBEngine.Where("token=?", token).Find(&tkLogs); err != nil {
166
+		return err
167
+	}
168
+
169
+	// 如果有相同批次的, 则更新本批次为失效
170
+	if tkLogs != nil && len(tkLogs) > 0 {
171
+		batchNo := []string{}
172
+
173
+		for _, t := range tkLogs {
174
+			if t.BatchNo != "" {
175
+				batchNo = append(batchNo, t.BatchNo)
176
+			}
177
+		}
178
+
179
+		if len(batchNo) > 0 {
180
+
181
+			if _, err := DBEngine.Cols("status").
182
+				Where("token=?", token).
183
+				Or("batch_no in ('" + strings.Join(batchNo, "','") + "'").
184
+				Update(&tk); err != nil {
185
+				return err
186
+			}
187
+
188
+			return nil
189
+		}
190
+	}
191
+
160 192
 	if _, err := DBEngine.Cols("status").Where("token=?", token).Or("uid=?", uid).Update(&tk); err != nil {
161 193
 		return err
162 194
 	}

+ 11
- 8
service/sys.go Parādīt failu

@@ -76,7 +76,7 @@ func (s *SysServ) AuthAndInitCtx(gctx *context.Context) map[string]interface{} {
76 76
 
77 77
 // NewToken 设置 TOKEN
78 78
 // 15 分钟后过期
79
-func (s *SysServ) NewToken() string {
79
+func (s *SysServ) NewToken(batch string) string {
80 80
 	var token *utils.JWTToken
81 81
 	exp := time.Now().Local().Add(15 * time.Second)
82 82
 
@@ -84,17 +84,19 @@ func (s *SysServ) NewToken() string {
84 84
 		userMap := s.ctx.Get("userMap").(model.TaUserMapping)
85 85
 
86 86
 		token = &utils.JWTToken{
87
-			Guest:  false,
88
-			ID:     userMap.Openid,
89
-			Expire: exp,
87
+			Guest:   false,
88
+			ID:      userMap.Openid,
89
+			Expire:  exp,
90
+			BatchNo: batch,
90 91
 		}
91 92
 	} else if s.ctx.Get("user") != nil {
92 93
 		user := s.ctx.Get("user").(model.SysUser)
93 94
 
94 95
 		token = &utils.JWTToken{
95
-			Guest:  false,
96
-			ID:     user.UserId,
97
-			Expire: exp,
96
+			Guest:   false,
97
+			ID:      user.UserId,
98
+			Expire:  exp,
99
+			BatchNo: batch,
98 100
 		}
99 101
 	} else {
100 102
 		token = &utils.JWTToken{
@@ -111,7 +113,7 @@ func (s *SysServ) NewToken() string {
111 113
 
112 114
 	// 入库
113 115
 	if !token.Guest {
114
-		if err := models.InsertToken(tokenEncodeStr, token.ID); err != nil {
116
+		if err := models.InsertToken(tokenEncodeStr, token.ID, batch, exp); err != nil {
115 117
 			utils.LogError("入库 Token 失败: " + err.Error())
116 118
 			return tokenEncodeStr
117 119
 		}
@@ -384,6 +386,7 @@ func (s *SysServ) getToken(gctx *context.Context) (*utils.JWTToken, error) {
384 386
 		return nil, errors.New("超时 或者 Token 已过期")
385 387
 	}
386 388
 
389
+	s.ctx.Set("token-batch", tk.BatchNo)
387 390
 	return utils.MapToJWTToken(token), nil
388 391
 }
389 392
 

+ 6
- 0
utils/jwt.go Parādīt failu

@@ -44,6 +44,7 @@ type JWTToken struct {
44 44
 	Guest    bool
45 45
 	ID       string
46 46
 	Password string
47
+	BatchNo  string
47 48
 	Expire   time.Time
48 49
 }
49 50
 
@@ -53,6 +54,7 @@ func (t *JWTToken) ToMap() map[string]interface{} {
53 54
 		"guest":    t.Guest,
54 55
 		"user":     t.ID,
55 56
 		"password": t.Password,
57
+		"batchno":  t.BatchNo,
56 58
 		"exp":      t.Expire.Format("2006-01-02 15:04:05"),
57 59
 	}
58 60
 }
@@ -73,6 +75,10 @@ func MapToJWTToken(data map[string]interface{}) *JWTToken {
73 75
 		token.Password = data["password"].(string)
74 76
 	}
75 77
 
78
+	if data["batchno"] != nil {
79
+		token.BatchNo = data["batchno"].(string)
80
+	}
81
+
76 82
 	if data["exp"] != nil {
77 83
 		exp, _ := time.Parse("2006-01-02 15:04:05", data["exp"].(string))
78 84
 		token.Expire = exp