115 lines
3.2 KiB
Go
115 lines
3.2 KiB
Go
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)
|
|
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")
|
|
}
|