mirror of
https://github.com/bjdgyc/anylink.git
synced 2025-11-07 04:36:29 +08:00
增加管理后台
This commit is contained in:
105
dbdata/user.go
105
dbdata/user.go
@@ -1,29 +1,98 @@
|
||||
package dbdata
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/bjdgyc/anylink/pkg/utils"
|
||||
"github.com/xlzd/gotp"
|
||||
)
|
||||
|
||||
const BucketUser = "user"
|
||||
|
||||
type User struct {
|
||||
Id int
|
||||
Username string
|
||||
Password string
|
||||
OtpSecret string
|
||||
Group []string
|
||||
// CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
Id int `json:"id" storm:"id,increment"`
|
||||
Username string `json:"username" storm:"unique"`
|
||||
Nickname string `json:"nickname"`
|
||||
Email string `json:"email"`
|
||||
// Password string `json:"password"`
|
||||
PinCode string `json:"pin_code"`
|
||||
OtpSecret string `json:"otp_secret"`
|
||||
Groups []string `json:"groups"`
|
||||
Status int8 `json:"status"` // 1正常
|
||||
SendEmail bool `json:"send_email"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
func GetUsers(lastKey string, prev bool) []User {
|
||||
res := getList(BucketUser, lastKey, prev)
|
||||
datas := make([]User, 0)
|
||||
for _, data := range res {
|
||||
d := User{}
|
||||
json.Unmarshal(data, &d)
|
||||
datas = append(datas, d)
|
||||
// 验证用户登陆信息
|
||||
func CheckUser(name, pwd, group string) error {
|
||||
// return nil
|
||||
|
||||
pl := len(pwd)
|
||||
if name == "" || pl < 6 {
|
||||
return errors.New("密码错误")
|
||||
}
|
||||
return datas
|
||||
v := &User{}
|
||||
err := One("Username", name, v)
|
||||
if err != nil || v.Status != 1 {
|
||||
return errors.New("用户名错误")
|
||||
}
|
||||
pass := pwd[:pl-6]
|
||||
// if !utils.PasswordVerify(pass, v.Password) {
|
||||
if pass != v.PinCode {
|
||||
return errors.New("密码错误")
|
||||
}
|
||||
otp := pwd[pl-6:]
|
||||
totp := gotp.NewDefaultTOTP(v.OtpSecret)
|
||||
unix := time.Now().Unix()
|
||||
verify := totp.Verify(otp, int(unix))
|
||||
if !verify {
|
||||
return errors.New("动态码错误")
|
||||
}
|
||||
|
||||
// 判断用户组信息
|
||||
if !utils.InArrStr(v.Groups, group) {
|
||||
return errors.New("用户组错误")
|
||||
}
|
||||
groupData := &Group{}
|
||||
err = One("Name", group, groupData)
|
||||
if err != nil || groupData.Status != 1 {
|
||||
return errors.New("用户组错误")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func SetUser(v *User) error {
|
||||
var err error
|
||||
if v.Username == "" || len(v.Groups) == 0 {
|
||||
return errors.New("用户名或组错误")
|
||||
}
|
||||
|
||||
planPass := v.PinCode
|
||||
// 自动生成密码
|
||||
if len(planPass) < 6 {
|
||||
planPass = utils.RandomNum(8)
|
||||
}
|
||||
v.PinCode = planPass
|
||||
|
||||
if v.OtpSecret == "" {
|
||||
v.OtpSecret = gotp.RandomSecret(24)
|
||||
}
|
||||
|
||||
// 判断组是否有效
|
||||
ng := []string{}
|
||||
groups := GetGroupNames()
|
||||
for _, g := range v.Groups {
|
||||
if utils.InArrStr(groups, g) {
|
||||
ng = append(ng, g)
|
||||
}
|
||||
}
|
||||
if len(ng) == 0 {
|
||||
return errors.New("用户名或组错误")
|
||||
}
|
||||
v.Groups = ng
|
||||
|
||||
v.UpdatedAt = time.Now()
|
||||
err = Save(v)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user