blog/BlogAdminService/internal/controller/LoginController.go

115 lines
3.2 KiB
Go

package controller
import (
"BlogAdmin/third_party/database"
"Common/model/AjaxResult"
"Common/model/admin"
"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)
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 admin.SysUser
result := database.GormTemplate.Where("username = ?", loginUser.Username).First(&user)
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
}
// 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"))
ctrl.Ctx.Redirect("/admin")
}