|
@@ -3,7 +3,7 @@ package controllers
|
3
|
3
|
import (
|
4
|
4
|
"errors"
|
5
|
5
|
"net/http"
|
6
|
|
- "spaceofcheng/services/models/model"
|
|
6
|
+ "spaceofcheng/services/models"
|
7
|
7
|
"spaceofcheng/services/service"
|
8
|
8
|
"spaceofcheng/services/utils"
|
9
|
9
|
"strings"
|
|
@@ -19,14 +19,70 @@ func (c *BaseController) authenticate() {
|
19
|
19
|
// 客户端类型
|
20
|
20
|
clientType := utils.GetClientType(c.Ctx.Request)
|
21
|
21
|
|
|
22
|
+ switch clientType {
|
|
23
|
+ case utils.ClientAdmin:
|
|
24
|
+ c.authPCAdmin(serv)
|
|
25
|
+ case utils.ClientWechat:
|
|
26
|
+ c.authWechat(serv)
|
|
27
|
+ default:
|
|
28
|
+ c.ResponseError(
|
|
29
|
+ errors.New("暂不支持的 API 场景"),
|
|
30
|
+ http.StatusBadRequest,
|
|
31
|
+ )
|
|
32
|
+ }
|
|
33
|
+}
|
|
34
|
+
|
|
35
|
+// authPCAdmin PC管理端
|
|
36
|
+func (c *BaseController) authPCAdmin(serv *service.SysServ) {
|
|
37
|
+ if !c.needAuth() {
|
|
38
|
+ return
|
|
39
|
+ }
|
|
40
|
+
|
|
41
|
+ // 用户ID
|
|
42
|
+ userID := ""
|
|
43
|
+ userIDRaw := c.GetSession(SNUserID)
|
|
44
|
+ if userIDRaw != nil {
|
|
45
|
+ userID = userIDRaw.(string)
|
|
46
|
+ }
|
|
47
|
+
|
|
48
|
+ if userID == "" {
|
|
49
|
+ c.ResponseError(
|
|
50
|
+ errors.New("用户未登录"),
|
|
51
|
+ http.StatusUnauthorized,
|
|
52
|
+ )
|
|
53
|
+ }
|
|
54
|
+
|
|
55
|
+ if err := serv.SetUserProfile(userID); err != nil {
|
|
56
|
+ utils.LogError(err.Error())
|
|
57
|
+
|
|
58
|
+ c.ResponseError(
|
|
59
|
+ errors.New("内部错误, 请重试"),
|
|
60
|
+ http.StatusInternalServerError,
|
|
61
|
+ )
|
|
62
|
+ }
|
|
63
|
+
|
|
64
|
+ // 设置 Session
|
|
65
|
+ c.SetSession(SNUserID, userID)
|
|
66
|
+ // c.SetSession(SNUserType, userType)
|
|
67
|
+}
|
|
68
|
+
|
|
69
|
+func (c *BaseController) authWechat(serv *service.SysServ) {
|
22
|
70
|
// 用户类型, 此处与数据库定义的不是一个概念
|
23
|
71
|
// 此处主要用来区分是 系统用户, 还是 系统客户
|
24
|
|
- userType := UserGuest
|
|
72
|
+ userType := ""
|
25
|
73
|
userTypeRaw := c.GetSession(SNUserType)
|
26
|
74
|
if userTypeRaw != nil {
|
27
|
75
|
userType = userTypeRaw.(string)
|
28
|
76
|
}
|
29
|
77
|
|
|
78
|
+ if userType == "" {
|
|
79
|
+ userType = models.USERMAP_CUSTOMER
|
|
80
|
+ identify := c.GetString("identify_type")
|
|
81
|
+ if identify == "admin" {
|
|
82
|
+ userType = models.USERMAP_USER
|
|
83
|
+ }
|
|
84
|
+ }
|
|
85
|
+
|
30
|
86
|
// 用户类型不同, 此处ID代表的内容也是不一样的
|
31
|
87
|
userID := ""
|
32
|
88
|
userIDRaw := c.GetSession(SNUserID)
|
|
@@ -34,52 +90,45 @@ func (c *BaseController) authenticate() {
|
34
|
90
|
userID = userIDRaw.(string)
|
35
|
91
|
}
|
36
|
92
|
|
37
|
|
- // 用户映射表
|
38
|
|
- var userMap *model.TaUserMapping
|
39
|
|
-
|
40
|
|
- if clientType == utils.ClientWechat && userID == "" {
|
41
|
|
- var err error
|
42
|
|
- userMap, err = c.checkWechat(serv)
|
43
|
|
- if err != nil {
|
44
|
|
- utils.LogError("获取并校验微信信息失败: " + err.Error())
|
45
|
|
- }
|
46
|
|
-
|
47
|
|
- c.SetSession("openid", userMap.Openid)
|
|
93
|
+ // 用户微信信息
|
|
94
|
+ var wxDetail map[string]interface{}
|
|
95
|
+ detailRaw := c.GetSession("wechat_user")
|
|
96
|
+ if detailRaw != nil {
|
|
97
|
+ wxDetail = detailRaw.(map[string]interface{})
|
48
|
98
|
}
|
49
|
99
|
|
50
|
|
- if !c.needAuth() {
|
51
|
|
- return
|
|
100
|
+ if userID == "" && wxDetail == nil {
|
|
101
|
+ wxDetail = c.getWechatDetail()
|
|
102
|
+ c.SetSession("wechat_user", wxDetail)
|
52
|
103
|
}
|
53
|
104
|
|
54
|
|
- // 如果是普通游客, 暂时没有任何设置
|
55
|
|
- if userType == UserGuest {
|
56
|
|
- return
|
|
105
|
+ // 用户映射
|
|
106
|
+ // 如果映射不存在, 则新建映射
|
|
107
|
+ userMap, err := serv.CheckWechatUserMapping(wxDetail, userType)
|
|
108
|
+ if err != nil {
|
|
109
|
+ c.ResponseError(
|
|
110
|
+ utils.LogError("获取人员映射账户失败: "+err.Error()),
|
|
111
|
+ http.StatusInternalServerError,
|
|
112
|
+ )
|
|
113
|
+
|
|
114
|
+ c.Context.Set("userMap", *userMap)
|
57
|
115
|
}
|
58
|
116
|
|
59
|
|
- // 如果存在用户映射
|
60
|
|
- mapUserID := c.getUserIDByUserMap(userMap, userID, userType)
|
61
|
|
- if mapUserID != "" {
|
62
|
|
- userID = mapUserID
|
|
117
|
+ if !c.needAuth() {
|
|
118
|
+ return
|
63
|
119
|
}
|
64
|
120
|
|
65
|
|
- // 未登录状态
|
66
|
|
- if userID == "" {
|
67
|
|
- if clientType == utils.ClientWechat {
|
68
|
|
- wxConf, ok := c.Configer[WeChatConf]
|
69
|
|
- if ok {
|
70
|
|
- c.ResponseData(
|
71
|
|
- map[string]interface{}{
|
72
|
|
- "appid": wxConf.String("appid"),
|
73
|
|
- },
|
74
|
|
- errors.New("用户未登录"),
|
75
|
|
- http.StatusUnauthorized,
|
76
|
|
- )
|
77
|
|
- } else {
|
78
|
|
- c.ResponseError(
|
79
|
|
- errors.New("用户未登录"),
|
80
|
|
- http.StatusUnauthorized,
|
81
|
|
- )
|
82
|
|
- }
|
|
121
|
+ // 未登录或者绑定, 返回 401
|
|
122
|
+ if userID == "" && userMap.UserId == "" {
|
|
123
|
+ wxConf, ok := c.Configer[WeChatConf]
|
|
124
|
+ if ok {
|
|
125
|
+ c.ResponseData(
|
|
126
|
+ map[string]interface{}{
|
|
127
|
+ "appid": wxConf.String("appid"),
|
|
128
|
+ },
|
|
129
|
+ errors.New("用户未登录"),
|
|
130
|
+ http.StatusUnauthorized,
|
|
131
|
+ )
|
83
|
132
|
} else {
|
84
|
133
|
c.ResponseError(
|
85
|
134
|
errors.New("用户未登录"),
|
|
@@ -88,26 +137,42 @@ func (c *BaseController) authenticate() {
|
88
|
137
|
}
|
89
|
138
|
}
|
90
|
139
|
|
91
|
|
- // 设置 Session
|
92
|
|
- c.SetSession(SNUserID, userID)
|
93
|
|
- c.SetSession(SNUserType, userType)
|
|
140
|
+ // 人员微信账号绑定错误
|
|
141
|
+ if userID != "" && userMap.UserId != "" &&
|
|
142
|
+ (userID != userMap.UserId || userType != userMap.UserType) {
|
|
143
|
+ c.ResponseError(
|
|
144
|
+ errors.New("系统内部数据错误, 人员绑定不正确"),
|
|
145
|
+ http.StatusInternalServerError,
|
|
146
|
+ )
|
|
147
|
+ }
|
94
|
148
|
|
95
|
|
- var err error
|
|
149
|
+ if userID == "" {
|
|
150
|
+ userID = userMap.UserId
|
|
151
|
+ }
|
96
|
152
|
|
97
|
|
- // 设置 Context
|
98
|
|
- // 放到 serv 的方法里面了
|
99
|
|
- if userType == UserAdmin {
|
100
|
|
- // 普通管理人员
|
101
|
|
- err = serv.SetUserProfile(userID)
|
|
153
|
+ if userType == models.USERMAP_USER {
|
|
154
|
+ if err := serv.SetUserProfile(userID); err != nil {
|
|
155
|
+ utils.LogError(err.Error())
|
102
|
156
|
|
|
157
|
+ c.ResponseError(
|
|
158
|
+ errors.New("内部错误, 请重试"),
|
|
159
|
+ http.StatusInternalServerError,
|
|
160
|
+ )
|
|
161
|
+ }
|
103
|
162
|
} else {
|
104
|
|
- // 系统客户
|
105
|
|
- err = serv.SetCustomer(userID)
|
106
|
|
- }
|
|
163
|
+ if err := serv.SetCustomer(userID); err != nil {
|
|
164
|
+ utils.LogError(err.Error())
|
107
|
165
|
|
108
|
|
- if err != nil {
|
109
|
|
- // 暂不处理
|
|
166
|
+ c.ResponseError(
|
|
167
|
+ errors.New("内部错误, 请重试"),
|
|
168
|
+ http.StatusInternalServerError,
|
|
169
|
+ )
|
|
170
|
+ }
|
110
|
171
|
}
|
|
172
|
+
|
|
173
|
+ // 设置 Session
|
|
174
|
+ c.SetSession(SNUserID, userID)
|
|
175
|
+ c.SetSession(SNUserType, userType)
|
111
|
176
|
}
|
112
|
177
|
|
113
|
178
|
func (c *BaseController) needAuth() bool {
|
|
@@ -122,63 +187,24 @@ func (c *BaseController) needAuth() bool {
|
122
|
187
|
return true
|
123
|
188
|
}
|
124
|
189
|
|
125
|
|
-func (c *BaseController) checkWechat(serv *service.SysServ) (*model.TaUserMapping, error) {
|
126
|
|
- // 确定客户端类型
|
127
|
|
- adminClient := c.GetString("admin")
|
128
|
|
- userType := service.USERTYPE_CUSTOMER
|
129
|
|
- if adminClient != "" {
|
130
|
|
- userType = service.USERTYPE_USER
|
131
|
|
- }
|
132
|
|
-
|
133
|
|
- openIDRaw := c.GetSession("openid")
|
134
|
|
- if openIDRaw != nil {
|
135
|
|
- openID := openIDRaw.(string)
|
136
|
|
- wxUser := map[string]interface{}{
|
137
|
|
- "openid": openID,
|
138
|
|
- }
|
139
|
|
- return serv.CheckWechatUserMapping(wxUser, userType)
|
140
|
|
- }
|
141
|
|
-
|
|
190
|
+// getWechatDetail 获取微信个人信息详情
|
|
191
|
+func (c *BaseController) getWechatDetail() map[string]interface{} {
|
142
|
192
|
// 微信 code
|
143
|
193
|
code := c.GetString("code")
|
144
|
194
|
if code == "" {
|
145
|
|
- return nil, errors.New("没有微信 code")
|
|
195
|
+ c.ResponseError(
|
|
196
|
+ errors.New("没有接收到微信 code"),
|
|
197
|
+ http.StatusBadRequest,
|
|
198
|
+ )
|
146
|
199
|
}
|
147
|
200
|
|
148
|
|
- // 获取微信信息
|
149
|
|
- wxUser, err := utils.GetWxUserInfo(code)
|
|
201
|
+ usr, err := utils.GetWxUserInfo(code)
|
150
|
202
|
if err != nil {
|
151
|
|
- return nil, err
|
152
|
|
- }
|
153
|
|
-
|
154
|
|
- return serv.CheckWechatUserMapping(wxUser, userType)
|
155
|
|
-}
|
156
|
|
-
|
157
|
|
-// getUserIDByUserMap 校验用户映射是否与 Session 一致
|
158
|
|
-func (c *BaseController) getUserIDByUserMap(user *model.TaUserMapping, userID, userType string) string {
|
159
|
|
- // 如果映射信息不存在
|
160
|
|
- if user == nil {
|
161
|
|
- return ""
|
162
|
|
- }
|
163
|
|
-
|
164
|
|
- // 如果 session 数据存在, 以 session 为准
|
165
|
|
- if userID != "" {
|
166
|
|
- return ""
|
167
|
|
- }
|
168
|
|
-
|
169
|
|
- // 如果是系统内置用户
|
170
|
|
- if user.UserType == service.USERTYPE_USER {
|
171
|
|
- if userType != UserAdmin {
|
172
|
|
- return ""
|
173
|
|
- }
|
174
|
|
- }
|
175
|
|
-
|
176
|
|
- // 如果是普通客户
|
177
|
|
- if user.UserType == service.USERTYPE_CUSTOMER {
|
178
|
|
- if userType != UserCustomer {
|
179
|
|
- return ""
|
180
|
|
- }
|
|
203
|
+ c.ResponseError(
|
|
204
|
+ utils.LogError("获取微信个人信息失败: "+err.Error()),
|
|
205
|
+ http.StatusInternalServerError,
|
|
206
|
+ )
|
181
|
207
|
}
|
182
|
208
|
|
183
|
|
- return user.UserId
|
|
209
|
+ return usr
|
184
|
210
|
}
|