From a533ee0a784b6e236bf9eb52c1eec31522f6fac8 Mon Sep 17 00:00:00 2001 From: wsczx Date: Sun, 16 Oct 2022 02:47:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=AC=E5=9C=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=AE=BE=E7=BD=AE=E8=BF=87=E6=9C=9F=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/cron/start.go | 2 ++ server/dbdata/db_orm.go | 14 ++++++++++++++ server/dbdata/tables.go | 1 + server/dbdata/user.go | 7 ++++++- server/go.mod | 3 ++- server/go.sum | 2 ++ server/sessdata/session.go | 16 ++++++++++++++++ web/src/pages/user/List.vue | 15 +++++++++++++-- 8 files changed, 56 insertions(+), 4 deletions(-) diff --git a/server/cron/start.go b/server/cron/start.go index 2692cfe..09a722a 100644 --- a/server/cron/start.go +++ b/server/cron/start.go @@ -3,6 +3,7 @@ package cron import ( "time" + "github.com/bjdgyc/anylink/sessdata" "github.com/go-co-op/gocron" ) @@ -10,5 +11,6 @@ func Start() { s := gocron.NewScheduler(time.Local) s.Cron("0 * * * *").Do(ClearAudit) s.Cron("0 * * * *").Do(ClearStatsInfo) + s.Every("1s").Do(sessdata.CloseUserLimittimeSession) s.StartAsync() } diff --git a/server/dbdata/db_orm.go b/server/dbdata/db_orm.go index 3de1fe5..65bc889 100644 --- a/server/dbdata/db_orm.go +++ b/server/dbdata/db_orm.go @@ -3,6 +3,7 @@ package dbdata import ( "errors" "reflect" + "time" "xorm.io/xorm" ) @@ -61,6 +62,19 @@ func One(fieldName string, value interface{}, data interface{}) error { return nil } +// 用户过期时间到达后,更新用户状态,并返回一个状态为过期的用户切片 +func CheckUserlimittime() []interface{} { + var user map[int64]User + var limitUser []interface{} + u := &User{Status: 2} + xdb.Where("limittime < ?", time.Now()).And("status = ?", 1).Update(u) + xdb.Where("status= ?", 2).Find(u) + for _, v := range user { + limitUser = append(limitUser, v.Username) + } + return limitUser +} + func CountAll(data interface{}) int { n, _ := xdb.Count(data) return int(n) diff --git a/server/dbdata/tables.go b/server/dbdata/tables.go index e0da7e0..04a15df 100644 --- a/server/dbdata/tables.go +++ b/server/dbdata/tables.go @@ -30,6 +30,7 @@ type User struct { Email string `json:"email" xorm:"varchar(255)"` // Password string `json:"password"` PinCode string `json:"pin_code" xorm:"varchar(32)"` + LimitTime time.Time `json:"limittime" xorm:"Datetime limittime"` OtpSecret string `json:"otp_secret" xorm:"varchar(255)"` DisableOtp bool `json:"disable_otp" xorm:"Bool"` // 禁用otp Groups []string `json:"groups" xorm:"Text"` diff --git a/server/dbdata/user.go b/server/dbdata/user.go index 7834013..1ba6f6a 100644 --- a/server/dbdata/user.go +++ b/server/dbdata/user.go @@ -104,7 +104,12 @@ func checkLocalUser(name, pwd, group string) error { v := &User{} err := One("Username", name, v) if err != nil || v.Status != 1 { - return fmt.Errorf("%s %s", name, "用户名错误") + switch v.Status { + case 0: + return fmt.Errorf("%s %s", name, "用户不存在或用户已停用") + case 2: + return fmt.Errorf("%s %s", name, "用户已过期") + } } // 判断用户组信息 if !utils.InArrStr(v.Groups, group) { diff --git a/server/go.mod b/server/go.mod index 9f361f8..7aa6ebc 100644 --- a/server/go.mod +++ b/server/go.mod @@ -4,6 +4,7 @@ go 1.18 require ( github.com/arl/statsviz v0.5.1 + github.com/deckarep/golang-set v1.8.0 github.com/go-co-op/gocron v1.17.0 github.com/go-ldap/ldap v3.0.3+incompatible github.com/go-sql-driver/mysql v1.6.0 @@ -30,6 +31,7 @@ require ( go.uber.org/atomic v1.10.0 golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 + golang.org/x/text v0.3.7 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac layeh.com/radius v0.0.0-20210819152912-ad72663a72ab xorm.io/xorm v1.2.2 @@ -66,7 +68,6 @@ require ( github.com/tklauser/numcpus v0.2.3 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect - golang.org/x/text v0.3.7 // indirect gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/server/go.sum b/server/go.sum index aa2f83a..5371b25 100644 --- a/server/go.sum +++ b/server/go.sum @@ -98,6 +98,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= diff --git a/server/sessdata/session.go b/server/sessdata/session.go index 70f3e7e..23d4095 100644 --- a/server/sessdata/session.go +++ b/server/sessdata/session.go @@ -13,6 +13,7 @@ import ( "github.com/bjdgyc/anylink/base" "github.com/bjdgyc/anylink/dbdata" "github.com/bjdgyc/anylink/pkg/utils" + mapset "github.com/deckarep/golang-set" "github.com/ivpusic/grpool" atomic2 "go.uber.org/atomic" ) @@ -113,6 +114,21 @@ func checkSession() { }() } +// 状态为过期的用户踢下线 +func CloseUserLimittimeSession() { + y := dbdata.CheckUserlimittime() + s := mapset.NewSetFromSlice(y) + for k, v := range sessions { + sessMux.Lock() + v.mux.Lock() + if !v.IsActive && s.Contains(v.Username) { + delete(sessions, k) + } + v.mux.Unlock() + sessMux.Unlock() + } +} + func GenToken() string { // 生成32位的 token bToken := make([]byte, 32) diff --git a/web/src/pages/user/List.vue b/web/src/pages/user/List.vue index 45b3805..0e7a73f 100644 --- a/web/src/pages/user/List.vue +++ b/web/src/pages/user/List.vue @@ -87,7 +87,8 @@ width="70"> @@ -182,6 +183,16 @@ + + + + + @@ -208,6 +219,7 @@ 启用 停用 + 过期 @@ -264,7 +276,6 @@ export default { {required: true, message: '请输入用户邮箱', trigger: 'blur'}, {type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']} ], - password: [ {min: 6, message: '长度大于 6 个字符', trigger: 'blur'} ],