account.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package auth
  2. import (
  3. "pms-api-go/pkg/lfshook"
  4. "gopkg.in/ini.v1"
  5. )
  6. var AuthAccounts = make(map[string]string)
  7. /* 20230419 pms 删除 =======================================================================================================
  8. // Login 登录认证
  9. // @tags PBX-Auth
  10. // @Summary 登录认证
  11. // @Description 获取登录参数(账号,密码,角色) 与数据库数据对比,认证通过返回 jwt token
  12. // @Accept json
  13. // @Produce json
  14. // @Param data body commonModel.UserInfoReqVO true "登录信息"
  15. // @Router /pbx/auth/login [post]
  16. func Login(ctx *gin.Context) {
  17. var userReqInfo commonModel.UserInfoReqVO
  18. if err := ctx.ShouldBindJSON(&userReqInfo); err != nil {
  19. api.Error(ctx, http.StatusBadRequest, err.Error())
  20. return
  21. }
  22. lfshook.NewLogger().Infof("user input info: %+v", userReqInfo)
  23. var info *commonModel.UserInfoVO
  24. // 用户名转换成分机号(数字)
  25. var err error
  26. result := utils.IsDigit(userReqInfo.UserName)
  27. if !result {
  28. // 用户登录
  29. lfshook.NewLogger().Info("login by user")
  30. info, err = services.AuthUser(userReqInfo.UserName, userReqInfo.Password)
  31. } else {
  32. // 分机登录
  33. lfshook.NewLogger().Info("login by digital")
  34. info, err = services.AuthDigital(userReqInfo.UserName, userReqInfo.Password)
  35. }
  36. if err != nil {
  37. weblog.AuthError(ctx.ClientIP(), err.Error())
  38. api.Error(ctx, http.StatusBadRequest, err.Error())
  39. return
  40. }
  41. exp := time.Now().Add(time.Duration(time.Hour * 24 * 31)).Unix()
  42. claim := commonModel.JWTCustomClaims{
  43. ID: info.ID,
  44. UserName: info.UserName,
  45. Role: info.Role,
  46. Extension: info.Exten,
  47. StandardClaims: jwt.StandardClaims{
  48. ExpiresAt: exp,
  49. },
  50. }
  51. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)
  52. tokenString, err := token.SignedString([]byte(configs.ConfigGlobal.IdentityKey))
  53. if err != nil {
  54. lfshook.NewLogger().Error(err)
  55. api.Error(ctx, http.StatusBadRequest, "signed failure")
  56. return
  57. }
  58. api.Success(ctx, fmt.Sprintf("Bearer %s", tokenString))
  59. }
  60. * ========================================================================================================================= */
  61. // AddAuth pms用户认证
  62. // @tags PBX-Auth
  63. // @Summary pms用户认证
  64. // @Description 从t_user表中抽出数据,添加到用户认证
  65. // @Security ApiKeyAuth
  66. func AddAuth() {
  67. // 取表 t_user 中用户
  68. /*var dbUser []commonModel.User
  69. if err := mysql.DBOrmInstance.Find(&dbUser); err != nil {
  70. lfshook.NewLogger().Error(err)
  71. }
  72. for _, item := range dbUser {
  73. AuthAccounts[item.UserName] = item.PassWord
  74. }
  75. fmt.Printf("extenList=%s\n", AuthAccounts)*/
  76. // 设计变更
  77. // 读取pms配置文件中的用户密码
  78. confPath := "/etc/asterisk/pms_api.conf"
  79. cfg, err := ini.Load(confPath)
  80. if err != nil {
  81. lfshook.NewLogger().Error(err)
  82. return
  83. }
  84. UserName := cfg.Section("general").Key("username").String()
  85. PassWord := cfg.Section("general").Key("password").String()
  86. if UserName == "" || PassWord == "" {
  87. lfshook.NewLogger().Error("/etc/asterisk/pms_api.conf not set username or password")
  88. return
  89. }
  90. AuthAccounts[UserName] = PassWord
  91. // fmt.Printf("extenList=%s\n", AuthAccounts)
  92. }
  93. // VtigerAddAuth vtiger用户认证
  94. // @tags PBX-Auth
  95. // @Summary vtiger用户认证
  96. // @Description 从配置文件中取出数据,添加到用户认证
  97. // @Security ApiKeyAuth
  98. func VtigerAddAuth() {
  99. // 读取vtiger配置文件中的用户密码
  100. // confPath := "/etc/asterisk/vtiger_api.conf"
  101. confPath := "/etc/asterisk/pms_api.conf"
  102. cfg, err := ini.Load(confPath)
  103. if err != nil {
  104. lfshook.NewLogger().Error(err)
  105. return
  106. }
  107. BasicAuthUser := cfg.Section("general").Key("vtigerBasicAuthUser").String()
  108. BasicAuthPWD := cfg.Section("general").Key("vtigerBasicAuthPWD").String()
  109. ApiKey := cfg.Section("general").Key("vtigerApiKey").String()
  110. ApiKeyValue := cfg.Section("general").Key("vtigerApiKeyValue").String()
  111. if (BasicAuthUser == "" || BasicAuthPWD == "") && (ApiKey == "" || ApiKeyValue == "") {
  112. lfshook.NewLogger().Error("/etc/asterisk/pms_api.conf not set vtigerBasicAuth or vtigerApiKey")
  113. return
  114. }
  115. AuthAccounts[BasicAuthUser] = BasicAuthPWD
  116. AuthAccounts[ApiKey] = ApiKeyValue
  117. // fmt.Printf("AuthAccounts=%s\n", AuthAccounts)
  118. }
  119. // ZohoAddAuth zoho用户认证
  120. // @tags PBX-Auth
  121. // @Summary zoho用户认证
  122. // @Description 从配置文件中取出数据,添加到用户认证
  123. // @Security ApiKeyAuth
  124. func ZohoAddAuth() {
  125. // 读取vtiger配置文件中的用户密码
  126. // confPath := "/etc/asterisk/vtiger_api.conf"
  127. confPath := "/etc/asterisk/pms_api.conf"
  128. cfg, err := ini.Load(confPath)
  129. if err != nil {
  130. lfshook.NewLogger().Error(err)
  131. return
  132. }
  133. BasicAuthUser := cfg.Section("general").Key("zohoBasicAuthUser").String()
  134. BasicAuthPWD := cfg.Section("general").Key("zohoBasicAuthPWD").String()
  135. if BasicAuthUser == "" || BasicAuthPWD == "" {
  136. lfshook.NewLogger().Error("/etc/asterisk/pms_api.conf not set zohoBasicAuthUser or zohoBasicAuthPWD")
  137. return
  138. }
  139. AuthAccounts[BasicAuthUser] = BasicAuthPWD
  140. // fmt.Printf("AuthAccounts=%s\n", AuthAccounts)
  141. }
  142. /* 20230419 pms 删除 =======================================================================================================
  143. // Logout 注销登录
  144. // @tags PBX-Auth
  145. // @Summary 注销登录
  146. // @Description 将 token 写入 redis, 标记注销。此 token 认证失效。
  147. // @Security ApiKeyAuth
  148. // @Accept json
  149. // @Produce json
  150. // @Router /pbx/auth/logout [get]
  151. func Logout(ctx *gin.Context) {
  152. ID, _ := ctx.Get("ID")
  153. UserName, _ := ctx.Get("UserName")
  154. authorization := ctx.GetHeader("Authorization")
  155. auth.Logout(authorization)
  156. api.Success(ctx, map[string]string{"ID": strconv.FormatInt(ID.(int64), 10), "UserName": UserName.(string)})
  157. }
  158. // CurrentUser 当前用户
  159. // @tags PBX-Auth
  160. // @Summary 当前用户
  161. // @Description 获取当前用户信息ID UserName Password Role UserExtension(关联的分机号) PanelQueueuNumber(关联的随机一个队列号)
  162. // @Security ApiKeyAuth
  163. // @Accept json
  164. // @Produce json
  165. // @Router /pbx/auth/currentuser [get]
  166. func CurrentUser(ctx *gin.Context) {
  167. ID, _ := ctx.Get("ID")
  168. if ID == nil {
  169. lfshook.NewLogger().Error("currentUser get no not found")
  170. api.Error(ctx, http.StatusInternalServerError, "not found id")
  171. return
  172. }
  173. idInt64 := ID.(int64)
  174. lfshook.NewLogger().Infof("currentUser id: %d", idInt64)
  175. dbUser := mysql.GetUserInfoByID(idInt64)
  176. // 根据分机号查询关联队列
  177. data, err := mysql.DBOrmInstance.SQL("select queue_name from t_queue_agent where exten = ? and agent_type='static'", dbUser.UserExtension).QueryString()
  178. if err != nil {
  179. lfshook.NewLogger().Errorf("currentUser get queue %+v", err)
  180. }
  181. if len(data) > 0 {
  182. dbUser.PanelQueueNumber = data[0]["queue_name"]
  183. }
  184. api.Success(ctx, dbUser)
  185. }
  186. // @tags PBX-Auth
  187. // @Summary 更新密码
  188. // @Description 更新当前用户密码
  189. // @Security ApiKeyAuth
  190. // @Accept json
  191. // @Produce json
  192. // @Router /pbx/auth/update-password [post]
  193. func UpdatePassword(ctx *gin.Context) {
  194. var info commonModel.UserPasswordVO
  195. if err := ctx.ShouldBind(&info); err != nil {
  196. api.Error(ctx, http.StatusBadRequest, err.Error())
  197. return
  198. }
  199. ID, _ := ctx.Get("ID")
  200. if ID == nil {
  201. lfshook.NewLogger().Error("currentUser get no not found")
  202. api.Error(ctx, http.StatusInternalServerError, "not found id")
  203. return
  204. }
  205. idInt64 := ID.(int64)
  206. user := commonModel.User{ID: idInt64}
  207. exist, err := mysql.DBOrmInstance.Get(&user)
  208. if err != nil {
  209. api.Error(ctx, http.StatusInternalServerError, err.Error())
  210. return
  211. }
  212. if !exist {
  213. api.Error(ctx, http.StatusInternalServerError, "not found user by id "+strconv.FormatInt(idInt64, 10))
  214. return
  215. }
  216. if user.PassWord != info.OldPassWord {
  217. api.Error(ctx, http.StatusInternalServerError, "old password error")
  218. return
  219. }
  220. user.PassWord = info.NewPassWord
  221. _, err = mysql.DBOrmInstance.ID(idInt64).Cols("password").Update(&user)
  222. if err != nil {
  223. api.Error(ctx, http.StatusInternalServerError, err.Error())
  224. return
  225. }
  226. api.Success(ctx, "success")
  227. }
  228. * ========================================================================================================================= */