package adm_controller import ( "Blog/bootstrap" "Blog/internal/model/result" "Blog/internal/repository" "image/color" "strings" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/sessions" "github.com/mojocn/base64Captcha" "github.com/sirupsen/logrus" "golang.org/x/crypto/bcrypt" ) type LoginController struct { Ctx iris.Context Session *sessions.Session } var store = base64Captcha.DefaultMemStore var DriverString *base64Captcha.DriverString = base64Captcha.NewDriverString( 50, 200, 0, 0, 4, "ABCDEFGHJKLMNPQRSTWXYZ", &color.RGBA{R: 0, G: 0, B: 0, A: 0}, nil, nil) func generateCaptcha() (string, string, error) { var driver base64Captcha.Driver = DriverString.ConvertFonts() capthcha := base64Captcha.NewCaptcha(driver, store) _, content, _ := capthcha.Driver.GenerateIdQuestionAnswer() item, err := capthcha.Driver.DrawCaptcha(content) if err != nil { return "", "", err } return content, item.EncodeB64string(), nil } func (ctrl *LoginController) Get() { content, b64s, err := generateCaptcha() if err != nil { ctrl.Ctx.JSON(result.Error("验证码生成错误!")) } session := sessions.Get(ctrl.Ctx) session.Set("captcha", content) profile := bootstrap.Config.Profile if profile == "dev" { ctrl.Ctx.ViewData("captcha", content) } ctrl.Ctx.ViewData("captchaBase64", b64s) ctrl.Ctx.View("/admin/login.html") } func (ctrl *LoginController) GetRefreshcaptcha() { content, captchaBase64, err := generateCaptcha() if err != nil { ctrl.Ctx.JSON(result.Error("验证码生成错误!")) } session := sessions.Get(ctrl.Ctx) session.Set("captcha", content) ctrl.Ctx.JSON(result.Ok(captchaBase64)) } type loginForm struct { Username string `json:"username"` Password string `json:"password"` Captcha string `json:"captcha"` } func (ctrl *LoginController) Post() { var loginUser loginForm if err := ctrl.Ctx.ReadBody(&loginUser); err != nil { // result := AjaxResult.Error("参数错误") // ctrl.Ctx.JSON(result) ctrl.Ctx.Redirect("/admin") return } session := sessions.Get(ctrl.Ctx) captcha := loginUser.Captcha sessionCaptcha := session.GetString("captcha") if !strings.EqualFold(captcha, sessionCaptcha) { // result := AjaxResult.Error("验证码错误") // ctrl.Ctx.JSON(result) ctrl.Ctx.ViewData("user", loginUser) ctrl.Ctx.ViewData("errorMsg", "验证码错误") ctrl.Ctx.View("/admin/login") return } // var user model.SysUser // sql := repository.UserRepository.DB.Gorm.ToSQL(func(tx *gorm.DB) *gorm.DB { // return tx.Table(consts.TABLE_SYS_USER).Where("username = ?", loginUser.Username).First(&user) // }) // logrus.Info(sql) // result := repository.UserRepository.DB.Gorm.Table(consts.TABLE_SYS_USER).Where("username = ?", loginUser.Username).First(&user) user := repository.UserRepository.FindOne("username = ?", loginUser.Username) if user == nil { ctrl.Ctx.ViewData("user", loginUser) ctrl.Ctx.ViewData("errorMsg", "账号不存在") ctrl.Ctx.View("/admin/login") return } // rowsAffected := result.RowsAffected // if rowsAffected > 1 { // // ctrl.Ctx.JSON(AjaxResult.Error("数据异常,后台错误!")) // ctrl.Ctx.Redirect("/admin") // return // } // if rowsAffected == 0 { // ctrl.Ctx.ViewData("user", loginUser) // ctrl.Ctx.ViewData("errorMsg", "账号不存在") // ctrl.Ctx.View("/admin/login") // return // } err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(loginUser.Password)) if err != nil { // ctrl.Ctx.JSON(AjaxResult.Error("密码错误!")) ctrl.Ctx.ViewData("user", loginUser) ctrl.Ctx.ViewData("errorMsg", "密码错误") ctrl.Ctx.View("/admin/login") return } // logrus.Info(user) session.Man.Destroy(ctrl.Ctx) newSession := session.Man.Start(ctrl.Ctx) newSession.Set("user", user) ctrl.Ctx.SetCookieKV("session_id_cookie", newSession.ID(), iris.CookieAllowSubdomains("www")) xFrowardedFor := ctrl.Ctx.GetHeader("X-Forwarded-For") logrus.Info("用户:", user.Username, "登录,IP为:", xFrowardedFor) // ctrl.Ctx.JSON(AjaxResult.Ok("login")) ctrl.Ctx.Redirect("/admin") }