/* * @description:登陆相关数据操作 * @Author: CP * @Date: 2020-09-02 09:56:28 * @FilePath: \construction_management\services\login_service.go */ package services import ( "errors" "fmt" "log" "net/http" "strconv" "time" "github.com/iris-contrib/middleware/jwt" "github.com/kataras/iris/v12" "go.mod/comm" "go.mod/conf" "go.mod/dao" "go.mod/datasource" "go.mod/lib" "go.mod/models" "go.mod/web/viewmodels" ) //定义项目用户Service接口 type LoginService interface { ValidRule(ctx iris.Context) (viewmodels.Login, error) ValidProjectAccount(viewmodels.Login, http.ResponseWriter) (error, string) Out(ctx iris.Context) error CrtateAccount(viewmodels.Login) error } //返回service操作类 type loginService struct { projectAccountDao *dao.ProjectAccountDao projectDao *dao.ProjectDao } //创建项目用户service func NewLoginService() LoginService { return &loginService{ projectAccountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()), projectDao: dao.NewProjectDao(datasource.InstanceDbMaster()), } } // 登陆验证 func (s *loginService) ValidRule(ctx iris.Context) (viewmodels.Login, error) { loginVaild := viewmodels.Login{} err := ctx.ReadJSON(&loginVaild) fmt.Println(loginVaild) if err != nil { log.Println("ReadForm转换异常, error=", err) return loginVaild, err } err = loginVaild.Validate() if err != nil { log.Println("登录验证, error=", err) return loginVaild, err } return loginVaild, nil } // 验证项目用户登陆相关 // func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (*viewmodels.ProjectAccount, error) { // // 1-1.工程项目是否存在 // projectInfo := s.projectDao.GetCode(loginData.Code) // if projectInfo.Id == 0 { // return nil, errors.New("工程建设管理员还未创建项目,禁止登录") // } // // 1-2.获得项目管理员 // projectAdminInfo := s.projectAccountDao.Get(projectInfo.UserId, projectInfo.Id) // if projectAdminInfo.Id == 0 { // return nil, errors.New("工程建设管理员不存在,禁止登录") // } // 2.验证登陆-临时 // projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account) // if projectAccountInfo.Id == 0 { // return nil, errors.New("未找到该账号") // } // // 2.账号停用 // if projectAccountInfo.Enable == 0 { // return nil, errors.New("该账号已被停用") // } // password := comm.CreatePasswordSign(loginData.Password, loginData.Account) // if projectAccountInfo.Password != password { // return nil, errors.New("密码不正确") // } // // 验证密码-TODO // Jlzf := lib.NewJlzf() // err := Jlzf.LoginValid(loginData) // if err != nil { // return nil, err // } // // 加密用户标识 // identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret) // if err != nil { // return nil, err // } // // 加密项目标识 // projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret) // if err != nil { // return nil, err // } // digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id)) // // 设置cookie // maxAge := 60 * 60 * 24 * 7 // params := url.Values{} // params.Add("identity", identity) // params.Add("attachedIdentity", projectId) // params.Add("digitalToken", digitalToken) // c := &http.Cookie{ // Name: "cm", // Value: params.Encode(), // Path: "/", // MaxAge: maxAge, // HttpOnly: true, // } // http.SetCookie(writer, c) // // TODO--分布式会话--后续需要在加入 // viewAccountData := comm.MakeProjectAccountVM(projectAccountInfo) // return &viewAccountData, nil // } func (s *loginService) CrtateAccount(loginData viewmodels.Login) error { newPsw := comm.CreatePasswordSign(loginData.Password, loginData.Account) account := &models.CmProjectAccount{Account: loginData.Account, Password: newPsw} err := s.projectAccountDao.Add(account) return err } // TODO -替换jwt // 验证项目用户登陆相关 func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (error, string) { // projectInfo := models.CmProject{} // 工程项目是否存在 // projectInfo.Code = loginData.Code // s.projectDao.Get(&projectInfo) // if projectInfo.Id == 0 { // return errors.New("工程建设管理员还未创建项目,禁止登录") // } // 获得项目用户 projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account) if projectAccountInfo.Id == 0 { return errors.New("账号/密码不正确"), "" } // 验证密码-TODO Jlzf := lib.NewJlzf() err := Jlzf.LoginValid(loginData) if err != nil { return err, "" } // 加密用户标识 identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret) if err != nil { return err, "" } // 加密项目标识 // projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret) // if err != nil { // return err // } // jwt token token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ // 根据需求,可以存一些必要的数据 "identity": identity, // 签发人 "iss": "cm", // 签发时间 "iat": time.Now().Unix(), // 设定过期时间,便于测试,设置7天过期 "exp": time.Now().Add(72 * time.Hour * time.Duration(1)).Unix(), }) // 使用设置的秘钥,签名生成jwt字符串 tokenString, _ := token.SignedString([]byte(conf.SignSecret)) // maxAge := 60 * 60 * 24 * 7 // params := url.Values{} // params.Add("token", tokenString) // c := &http.Cookie{ // Name: "cm", // Value: tokenString, //params.Encode(), // Path: "/", // MaxAge: maxAge, // //HttpOnly: true, // } // http.SetCookie(writer, c) // TODO--分布式会话--后续需要在加入 return nil, tokenString } // 登出 func (s *loginService) Out(ctx iris.Context) error { // 作废jwt token // 移除cookie ctx.RemoveCookie("cm") return nil } //fmt.Println(ctx.FormValues()) // list := ctx.FormValues() // loginVaild := viewmodels.Login{} // v := reflect.ValueOf(&loginVaild).Elem() // for path, values := range list { // //fmt.Println(path) // //fmt.Println(values) // if path != "csrf.Token" { // v.FieldByName(Ucfirst(path)).Set(reflect.ValueOf(values[0])) // } // } //fmt.Println(loginVaild) // loginVaild := viewmodels.Login{ // Code: ctx.FormValue("code"), // Account: ctx.FormValue("account"), // Password: ctx.FormValue("password"), // } // // 加密用户标识 生成数字证书 // identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret) // if err != nil { // return err // } // digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id)) // // 设置cookie // maxAge := 60 * 60 * 24 * 7 // params := url.Values{} // params.Add("identity", identity) // params.Add("digitalToken", digitalToken) // c := &http.Cookie{ // Name: "cm", // Value: params.Encode(), // Path: "/", // MaxAge: maxAge, // } // http.SetCookie(writer, c)