login_service.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /*
  2. * @description:登陆相关数据操作
  3. * @Author: CP
  4. * @Date: 2020-09-02 09:56:28
  5. * @FilePath: \construction_management\services\login_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "log"
  11. "net/http"
  12. "strconv"
  13. "time"
  14. "github.com/iris-contrib/middleware/jwt"
  15. "github.com/kataras/iris/v12"
  16. "go.mod/comm"
  17. "go.mod/conf"
  18. "go.mod/dao"
  19. "go.mod/datasource"
  20. "go.mod/lib"
  21. "go.mod/models"
  22. "go.mod/web/viewmodels"
  23. )
  24. //定义项目用户Service接口
  25. type LoginService interface {
  26. ValidRule(ctx iris.Context) (viewmodels.Login, error)
  27. ValidProjectAccount(viewmodels.Login, http.ResponseWriter) (error, string)
  28. Out(ctx iris.Context) error
  29. CrtateAccount(viewmodels.Login) error
  30. }
  31. //返回service操作类
  32. type loginService struct {
  33. projectAccountDao *dao.ProjectAccountDao
  34. projectDao *dao.ProjectDao
  35. }
  36. //创建项目用户service
  37. func NewLoginService() LoginService {
  38. return &loginService{
  39. projectAccountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
  40. projectDao: dao.NewProjectDao(datasource.InstanceDbMaster()),
  41. }
  42. }
  43. // 登陆验证
  44. func (s *loginService) ValidRule(ctx iris.Context) (viewmodels.Login, error) {
  45. loginVaild := viewmodels.Login{}
  46. err := ctx.ReadJSON(&loginVaild)
  47. if err != nil {
  48. log.Println("ReadForm转换异常, error=", err)
  49. return loginVaild, err
  50. }
  51. err = loginVaild.Validate()
  52. if err != nil {
  53. log.Println("登录验证, error=", err)
  54. return loginVaild, err
  55. }
  56. return loginVaild, nil
  57. }
  58. // 验证项目用户登陆相关
  59. // func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (*viewmodels.ProjectAccount, error) {
  60. // // 1-1.工程项目是否存在
  61. // projectInfo := s.projectDao.GetCode(loginData.Code)
  62. // if projectInfo.Id == 0 {
  63. // return nil, errors.New("工程建设管理员还未创建项目,禁止登录")
  64. // }
  65. // // 1-2.获得项目管理员
  66. // projectAdminInfo := s.projectAccountDao.Get(projectInfo.UserId, projectInfo.Id)
  67. // if projectAdminInfo.Id == 0 {
  68. // return nil, errors.New("工程建设管理员不存在,禁止登录")
  69. // }
  70. // 2.验证登陆-临时
  71. // projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account)
  72. // if projectAccountInfo.Id == 0 {
  73. // return nil, errors.New("未找到该账号")
  74. // }
  75. // // 2.账号停用
  76. // if projectAccountInfo.Enable == 0 {
  77. // return nil, errors.New("该账号已被停用")
  78. // }
  79. // password := comm.CreatePasswordSign(loginData.Password, loginData.Account)
  80. // if projectAccountInfo.Password != password {
  81. // return nil, errors.New("密码不正确")
  82. // }
  83. // // 验证密码-TODO
  84. // Jlzf := lib.NewJlzf()
  85. // err := Jlzf.LoginValid(loginData)
  86. // if err != nil {
  87. // return nil, err
  88. // }
  89. // // 加密用户标识
  90. // identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  91. // if err != nil {
  92. // return nil, err
  93. // }
  94. // // 加密项目标识
  95. // projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
  96. // if err != nil {
  97. // return nil, err
  98. // }
  99. // digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
  100. // // 设置cookie
  101. // maxAge := 60 * 60 * 24 * 7
  102. // params := url.Values{}
  103. // params.Add("identity", identity)
  104. // params.Add("attachedIdentity", projectId)
  105. // params.Add("digitalToken", digitalToken)
  106. // c := &http.Cookie{
  107. // Name: "cm",
  108. // Value: params.Encode(),
  109. // Path: "/",
  110. // MaxAge: maxAge,
  111. // HttpOnly: true,
  112. // }
  113. // http.SetCookie(writer, c)
  114. // // TODO--分布式会话--后续需要在加入
  115. // viewAccountData := comm.MakeProjectAccountVM(projectAccountInfo)
  116. // return &viewAccountData, nil
  117. // }
  118. func (s *loginService) CrtateAccount(loginData viewmodels.Login) error {
  119. newPsw := comm.CreatePasswordSign(loginData.Password, loginData.Account)
  120. account := &models.CmProjectAccount{Account: loginData.Account, Password: newPsw}
  121. err := s.projectAccountDao.Add(account)
  122. return err
  123. }
  124. // TODO -替换jwt
  125. // 验证项目用户登陆相关
  126. func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (error, string) {
  127. // projectInfo := models.CmProject{}
  128. // 工程项目是否存在
  129. // projectInfo.Code = loginData.Code
  130. // s.projectDao.Get(&projectInfo)
  131. // if projectInfo.Id == 0 {
  132. // return errors.New("工程建设管理员还未创建项目,禁止登录")
  133. // }
  134. // 获得项目用户
  135. projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account)
  136. if projectAccountInfo.Id == 0 {
  137. return errors.New("账号/密码不正确"), ""
  138. }
  139. // 验证密码-TODO
  140. Jlzf := lib.NewJlzf()
  141. err := Jlzf.LoginValid(loginData)
  142. if err != nil {
  143. return err, ""
  144. }
  145. // 加密用户标识
  146. identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  147. if err != nil {
  148. return err, ""
  149. }
  150. // 加密项目标识
  151. // projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
  152. // if err != nil {
  153. // return err
  154. // }
  155. // jwt token
  156. token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
  157. // 根据需求,可以存一些必要的数据
  158. "identity": identity,
  159. // 签发人
  160. "iss": "cm",
  161. // 签发时间
  162. "iat": time.Now().Unix(),
  163. // 设定过期时间,便于测试,设置7天过期
  164. "exp": time.Now().Add(72 * time.Hour * time.Duration(1)).Unix(),
  165. })
  166. // 使用设置的秘钥,签名生成jwt字符串
  167. tokenString, _ := token.SignedString([]byte(conf.SignSecret))
  168. // maxAge := 60 * 60 * 24 * 7
  169. // params := url.Values{}
  170. // params.Add("token", tokenString)
  171. // c := &http.Cookie{
  172. // Name: "cm",
  173. // Value: tokenString, //params.Encode(),
  174. // Path: "/",
  175. // MaxAge: maxAge,
  176. // //HttpOnly: true,
  177. // }
  178. // http.SetCookie(writer, c)
  179. // TODO--分布式会话--后续需要在加入
  180. return nil, tokenString
  181. }
  182. // 登出
  183. func (s *loginService) Out(ctx iris.Context) error {
  184. // 作废jwt token
  185. // 移除cookie
  186. ctx.RemoveCookie("cm")
  187. return nil
  188. }
  189. //fmt.Println(ctx.FormValues())
  190. // list := ctx.FormValues()
  191. // loginVaild := viewmodels.Login{}
  192. // v := reflect.ValueOf(&loginVaild).Elem()
  193. // for path, values := range list {
  194. // //fmt.Println(path)
  195. // //fmt.Println(values)
  196. // if path != "csrf.Token" {
  197. // v.FieldByName(Ucfirst(path)).Set(reflect.ValueOf(values[0]))
  198. // }
  199. // }
  200. //fmt.Println(loginVaild)
  201. // loginVaild := viewmodels.Login{
  202. // Code: ctx.FormValue("code"),
  203. // Account: ctx.FormValue("account"),
  204. // Password: ctx.FormValue("password"),
  205. // }
  206. // // 加密用户标识 生成数字证书
  207. // identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  208. // if err != nil {
  209. // return err
  210. // }
  211. // digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
  212. // // 设置cookie
  213. // maxAge := 60 * 60 * 24 * 7
  214. // params := url.Values{}
  215. // params.Add("identity", identity)
  216. // params.Add("digitalToken", digitalToken)
  217. // c := &http.Cookie{
  218. // Name: "cm",
  219. // Value: params.Encode(),
  220. // Path: "/",
  221. // MaxAge: maxAge,
  222. // }
  223. // http.SetCookie(writer, c)