143 lines
3.9 KiB
Go
143 lines
3.9 KiB
Go
package oauth
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"management/internal/db/model/dto"
|
|
db "management/internal/db/sqlc"
|
|
"management/internal/pkg/crypto"
|
|
captchaservice "management/internal/service/captcha"
|
|
systemservice "management/internal/service/system"
|
|
"management/internal/tpl"
|
|
|
|
"github.com/zhang2092/browser"
|
|
)
|
|
|
|
func Login(w http.ResponseWriter, r *http.Request) {
|
|
// ctx := r.Context()
|
|
// var user dto.AuthorizeUser
|
|
// u := session.GetBytes(ctx, authglobal.StoreName)
|
|
// if err := json.Unmarshal(u, &user); err == nil {
|
|
// // 判断租户是否一致, 一致则刷新令牌,跳转到首页
|
|
// if err := session.RenewToken(ctx); err == nil {
|
|
// session.Put(ctx, authglobal.StoreName, u)
|
|
// http.Redirect(w, r, "/home.html", http.StatusFound)
|
|
// return
|
|
// }
|
|
// }
|
|
|
|
// session.Destroy(ctx)
|
|
tpl.HTML(w, r, "oauth/login.tmpl", nil)
|
|
}
|
|
|
|
func PostLogin(w http.ResponseWriter, r *http.Request) {
|
|
email := strings.TrimSpace(r.PostFormValue("email"))
|
|
password := strings.TrimSpace(r.PostFormValue("password"))
|
|
captchaID := strings.TrimSpace(r.PostFormValue("captcha_id"))
|
|
captcha := strings.TrimSpace(r.PostFormValue("captcha"))
|
|
if len(email) == 0 {
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "请填写邮箱"})
|
|
return
|
|
}
|
|
if len(password) == 0 {
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "请填写密码"})
|
|
return
|
|
}
|
|
if len(captcha) == 0 {
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "请填写验证码"})
|
|
return
|
|
}
|
|
if !captchaservice.Verify(captchaID, captcha, true) {
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "验证码错误"})
|
|
return
|
|
}
|
|
|
|
br, err := browser.NewBrowser(r.Header.Get("User-Agent"))
|
|
if err != nil {
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "平台信息获取错误"})
|
|
return
|
|
}
|
|
|
|
ctx := r.Context()
|
|
log := &db.CreateSysUserLoginLogParams{
|
|
CreatedAt: time.Now(),
|
|
Email: email,
|
|
IsSuccess: false,
|
|
RefererUrl: r.Header.Get("Referer"),
|
|
Url: r.URL.RequestURI(),
|
|
Os: br.Platform().Name(),
|
|
Ip: r.RemoteAddr,
|
|
Browser: br.Name(),
|
|
}
|
|
|
|
user, err := systemservice.GetSysUserByEmail(ctx, email)
|
|
if err != nil {
|
|
log.Message = err.Error()
|
|
_ = systemservice.CreateSysUserLoginLog(ctx, log)
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
log.UserUuid = user.Uuid
|
|
log.Username = user.Username
|
|
|
|
err = crypto.BcryptComparePassword(user.HashedPassword, password+user.Salt)
|
|
if err != nil {
|
|
log.Message = "compare password failed"
|
|
_ = systemservice.CreateSysUserLoginLog(ctx, log)
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "compare password failed"})
|
|
return
|
|
}
|
|
|
|
// 登陆成功
|
|
|
|
if user.RoleID == 0 {
|
|
log.Message = "账号没有配置角色, 请联系管理员"
|
|
_ = systemservice.CreateSysUserLoginLog(ctx, log)
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "账号没有配置角色, 请联系管理员"})
|
|
return
|
|
}
|
|
|
|
sysRole, err := systemservice.GetSysRole(ctx, user.RoleID)
|
|
if err != nil {
|
|
log.Message = "账号配置的角色错误, 请联系管理员"
|
|
_ = systemservice.CreateSysUserLoginLog(ctx, log)
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: "账号配置的角色错误, 请联系管理员"})
|
|
return
|
|
}
|
|
|
|
auth := dto.AuthorizeUser{
|
|
ID: user.ID,
|
|
Uuid: user.Uuid,
|
|
Email: user.Email,
|
|
Username: user.Username,
|
|
RoleID: sysRole.ID,
|
|
RoleName: sysRole.Name,
|
|
OS: log.Os,
|
|
IP: log.Ip,
|
|
Browser: log.Browser,
|
|
}
|
|
|
|
_, err = json.Marshal(auth)
|
|
if err != nil {
|
|
log.Message = err.Error()
|
|
_ = systemservice.CreateSysUserLoginLog(ctx, log)
|
|
tpl.JSON(w, tpl.Response{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
|
|
// session.Put(ctx, authglobal.StoreName, b)
|
|
|
|
log.IsSuccess = true
|
|
log.Message = "登陆成功"
|
|
_ = systemservice.CreateSysUserLoginLog(ctx, log)
|
|
tpl.JSONOK(w, "login successful")
|
|
}
|
|
|
|
func Logout(w http.ResponseWriter, r *http.Request) {
|
|
// session.Destroy(r.Context())
|
|
http.Redirect(w, r, "/", http.StatusFound)
|
|
}
|