blog/internal/controller/adm_controller/login_controller.go

139 lines
4.0 KiB
Go

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")
}