zjxpcyc 6 年之前
父節點
當前提交
e04e9b1087
共有 6 個檔案被更改,包括 62 行新增10 行删除
  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 查看文件

49
 
49
 
50
 // CreateNewToken 新 token
50
 // CreateNewToken 新 token
51
 func (c *BaseController) CreateNewToken() {
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 查看文件

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

+ 2
- 0
models/model/sys_token_log.go 查看文件

8
 	Uid        string    `xorm:"VARCHAR(64)"`
8
 	Uid        string    `xorm:"VARCHAR(64)"`
9
 	Status     int       `xorm:"SMALLINT(6)"`
9
 	Status     int       `xorm:"SMALLINT(6)"`
10
 	CreateDate time.Time `xorm:"DATETIME"`
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 查看文件

3
 import (
3
 import (
4
 	"errors"
4
 	"errors"
5
 	"spaceofcheng/services/models/model"
5
 	"spaceofcheng/services/models/model"
6
+	"strings"
6
 	"time"
7
 	"time"
7
 
8
 
8
 	"github.com/yl10/kit/guid"
9
 	"github.com/yl10/kit/guid"
136
 }
137
 }
137
 
138
 
138
 // InsertToken 插入 token 生成记录
139
 // InsertToken 插入 token 生成记录
139
-func InsertToken(token, uid string) error {
140
+func InsertToken(token, uid, batchNo string, expire time.Time) error {
140
 	tk := model.SysTokenLog{
141
 	tk := model.SysTokenLog{
141
 		Token:      token,
142
 		Token:      token,
142
 		Uid:        uid,
143
 		Uid:        uid,
144
+		BatchNo:    batchNo,
145
+		ExpireDate: expire,
143
 		Status:     STATUS_NORMAL,
146
 		Status:     STATUS_NORMAL,
144
 		CreateDate: time.Now().Local(),
147
 		CreateDate: time.Now().Local(),
145
 	}
148
 	}
157
 		Status: STATUS_DEL,
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
 	if _, err := DBEngine.Cols("status").Where("token=?", token).Or("uid=?", uid).Update(&tk); err != nil {
192
 	if _, err := DBEngine.Cols("status").Where("token=?", token).Or("uid=?", uid).Update(&tk); err != nil {
161
 		return err
193
 		return err
162
 	}
194
 	}

+ 11
- 8
service/sys.go 查看文件

76
 
76
 
77
 // NewToken 设置 TOKEN
77
 // NewToken 设置 TOKEN
78
 // 15 分钟后过期
78
 // 15 分钟后过期
79
-func (s *SysServ) NewToken() string {
79
+func (s *SysServ) NewToken(batch string) string {
80
 	var token *utils.JWTToken
80
 	var token *utils.JWTToken
81
 	exp := time.Now().Local().Add(15 * time.Second)
81
 	exp := time.Now().Local().Add(15 * time.Second)
82
 
82
 
84
 		userMap := s.ctx.Get("userMap").(model.TaUserMapping)
84
 		userMap := s.ctx.Get("userMap").(model.TaUserMapping)
85
 
85
 
86
 		token = &utils.JWTToken{
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
 	} else if s.ctx.Get("user") != nil {
92
 	} else if s.ctx.Get("user") != nil {
92
 		user := s.ctx.Get("user").(model.SysUser)
93
 		user := s.ctx.Get("user").(model.SysUser)
93
 
94
 
94
 		token = &utils.JWTToken{
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
 	} else {
101
 	} else {
100
 		token = &utils.JWTToken{
102
 		token = &utils.JWTToken{
111
 
113
 
112
 	// 入库
114
 	// 入库
113
 	if !token.Guest {
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
 			utils.LogError("入库 Token 失败: " + err.Error())
117
 			utils.LogError("入库 Token 失败: " + err.Error())
116
 			return tokenEncodeStr
118
 			return tokenEncodeStr
117
 		}
119
 		}
384
 		return nil, errors.New("超时 或者 Token 已过期")
386
 		return nil, errors.New("超时 或者 Token 已过期")
385
 	}
387
 	}
386
 
388
 
389
+	s.ctx.Set("token-batch", tk.BatchNo)
387
 	return utils.MapToJWTToken(token), nil
390
 	return utils.MapToJWTToken(token), nil
388
 }
391
 }
389
 
392
 

+ 6
- 0
utils/jwt.go 查看文件

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