package admin import ( "blog/internal/model/AjaxResult" "blog/internal/model/admin" "blog/third_party/database" "image/color" "log" "strings" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/sessions" "github.com/mojocn/base64Captcha" "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(AjaxResult.Error("验证码生成错误!")) } session := sessions.Get(ctrl.Ctx) session.Set("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(AjaxResult.Error("验证码生成错误!")) } session := sessions.Get(ctrl.Ctx) session.Set("captcha", content) ctrl.Ctx.JSON(AjaxResult.Ok(captchaBase64)) } func (ctrl *LoginController) Post() { var loginUser admin.SysUserLogin if err := ctrl.Ctx.ReadBody(&loginUser); err != nil { result := AjaxResult.Error("参数错误") ctrl.Ctx.JSON(result) 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) return } var user admin.SysUser result := database.GormTemplate.Where("username = ?", loginUser.Username).First(&user) rowsAffected := result.RowsAffected if rowsAffected > 1 { ctrl.Ctx.JSON(AjaxResult.Error("数据异常,后台错误!")) return } err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(loginUser.Password)) if err != nil { ctrl.Ctx.JSON(AjaxResult.Error("密码错误!")) return } // log.Println(user) session.Man.Destroy(ctrl.Ctx) newSession := session.Man.Start(ctrl.Ctx) newSession.Set("user", user) ctrl.Ctx.SetCookieKV("session_id_cookie", newSession.ID()) xFrowardedFor := ctrl.Ctx.GetHeader("X-Forwarded-For") log.Println("用户:", user.Username, "登录,IP为:", xFrowardedFor) ctrl.Ctx.JSON(AjaxResult.Ok("login")) }