139 lines
4.0 KiB
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")
|
|
}
|