login_service.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. "fmt"
  11. "log"
  12. "net/http"
  13. "strconv"
  14. "time"
  15. "github.com/iris-contrib/middleware/jwt"
  16. "github.com/kataras/iris/v12"
  17. "go.mod/comm"
  18. "go.mod/conf"
  19. "go.mod/dao"
  20. "go.mod/datasource"
  21. "go.mod/lib"
  22. "go.mod/models"
  23. "go.mod/web/viewmodels"
  24. )
  25. //定义项目用户Service接口
  26. type LoginService interface {
  27. ValidRule(ctx iris.Context) (viewmodels.Login, error)
  28. ValidProjectAccount(viewmodels.Login, http.ResponseWriter) error
  29. }
  30. //返回service操作类
  31. type loginService struct {
  32. projectAccountDao *dao.ProjectAccountDao
  33. projectDao *dao.ProjectDao
  34. }
  35. //创建项目用户service
  36. func NewLoginService() LoginService {
  37. return &loginService{
  38. projectAccountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
  39. projectDao: dao.NewProjectDao(datasource.InstanceDbMaster()),
  40. }
  41. }
  42. // 登陆验证
  43. func (s *loginService) ValidRule(ctx iris.Context) (viewmodels.Login, error) {
  44. loginVaild := viewmodels.Login{}
  45. err := ctx.ReadJSON(&loginVaild)
  46. fmt.Println(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) error {
  60. projectInfo := models.CmProject{}
  61. // 工程项目是否存在
  62. projectInfo.Code = loginData.Code
  63. s.projectDao.Get(&projectInfo)
  64. if projectInfo.Id == 0 {
  65. return errors.New("工程建设管理员还未创建拉取项目,禁止登录")
  66. }
  67. // 获得项目用户
  68. projectAccountInfo := s.projectAccountDao.Get(projectInfo.UserId)
  69. if projectAccountInfo.Id == 0 {
  70. return errors.New("工程建设管理员不存在,禁止登录")
  71. }
  72. // 验证密码
  73. Jlzf := lib.NewJlzf()
  74. err := Jlzf.LoginValid(loginData)
  75. if err != nil {
  76. return err
  77. }
  78. // 加密用户标识
  79. identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  80. if err != nil {
  81. return err
  82. }
  83. // 加密项目标识
  84. projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
  85. if err != nil {
  86. return err
  87. }
  88. // jwt token
  89. token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
  90. // 根据需求,可以存一些必要的数据
  91. "identity": identity,
  92. "project": projectId,
  93. // 签发人
  94. "iss": "cm",
  95. // 签发时间
  96. "iat": time.Now().Unix(),
  97. // 设定过期时间,便于测试,设置1分钟过期
  98. "exp": time.Now().Add(72 * time.Hour * time.Duration(1)).Unix(),
  99. })
  100. // 使用设置的秘钥,签名生成jwt字符串
  101. tokenString, _ := token.SignedString([]byte(conf.SignSecret))
  102. fmt.Println(tokenString)
  103. maxAge := 60 * 60 * 24 * 7
  104. // params := url.Values{}
  105. // params.Add("token", tokenString)
  106. c := &http.Cookie{
  107. Name: "cm",
  108. Value: tokenString, //params.Encode(),
  109. Path: "/",
  110. MaxAge: maxAge,
  111. }
  112. http.SetCookie(writer, c)
  113. // // 加密用户标识 生成数字证书
  114. // identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  115. // if err != nil {
  116. // return err
  117. // }
  118. // digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
  119. // // 设置cookie
  120. // maxAge := 60 * 60 * 24 * 7
  121. // params := url.Values{}
  122. // params.Add("identity", identity)
  123. // params.Add("digitalToken", digitalToken)
  124. // c := &http.Cookie{
  125. // Name: "cm",
  126. // Value: params.Encode(),
  127. // Path: "/",
  128. // MaxAge: maxAge,
  129. // }
  130. // http.SetCookie(writer, c)
  131. // TODO--分布式会话--后续需要在加入
  132. return nil
  133. }
  134. //fmt.Println(ctx.FormValues())
  135. // list := ctx.FormValues()
  136. // loginVaild := viewmodels.Login{}
  137. // v := reflect.ValueOf(&loginVaild).Elem()
  138. // for path, values := range list {
  139. // //fmt.Println(path)
  140. // //fmt.Println(values)
  141. // if path != "csrf.Token" {
  142. // v.FieldByName(Ucfirst(path)).Set(reflect.ValueOf(values[0]))
  143. // }
  144. // }
  145. //fmt.Println(loginVaild)
  146. // loginVaild := viewmodels.Login{
  147. // Code: ctx.FormValue("code"),
  148. // Account: ctx.FormValue("account"),
  149. // Password: ctx.FormValue("password"),
  150. // }