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'}
],