Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
FLIPPED-AURORA
gin-vue-admin
提交
3ec0a7cf
G
gin-vue-admin
项目概览
FLIPPED-AURORA
/
gin-vue-admin
大约 1 年 前同步成功
通知
333
Star
18155
Fork
5506
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gin-vue-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
3ec0a7cf
编写于
9月 01, 2021
作者:
Mr.奇淼(
提交者:
GitHub
9月 01, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #653 from songzhibin97/gva_gormv2_dev
feat:新增定时任务 删除jwt
上级
2f8a3e35
ac60596a
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
176 addition
and
9 deletion
+176
-9
server/config.yaml
server/config.yaml
+1
-0
server/core/viper.go
server/core/viper.go
+11
-0
server/global/global.go
server/global/global.go
+3
-0
server/go.mod
server/go.mod
+2
-1
server/initialize/timer.go
server/initialize/timer.go
+2
-2
server/plugin/ws/utils/utils.go
server/plugin/ws/utils/utils.go
+52
-0
server/plugin/ws/ws.go
server/plugin/ws/ws.go
+83
-0
server/service/system/jwt_black_list.go
server/service/system/jwt_black_list.go
+22
-6
未找到文件。
server/config.yaml
浏览文件 @
3ec0a7cf
...
...
@@ -130,6 +130,7 @@ Timer:
# interval: 时间间隔, 具体配置详看 time.ParseDuration() 中字符串表示 且不能为负数
# 2160h = 24 * 30 * 3 -> 三个月
{
tableName
:
"
sys_operation_records"
,
compareField
:
"
created_at"
,
interval
:
"
2160h"
},
{
tableName
:
"
jwt_blacklists"
,
compareField
:
"
created_at"
,
interval
:
"
168h"
}
#{ tableName: "log2" , compareField: "created_at", interval: "2160h" }
]
server/core/viper.go
浏览文件 @
3ec0a7cf
...
...
@@ -5,6 +5,11 @@ import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/flipped-aurora/gin-vue-admin/server/service/system"
"github.com/songzhibin97/gkit/cache/local_cache"
"github.com/flipped-aurora/gin-vue-admin/server/global"
_
"github.com/flipped-aurora/gin-vue-admin/server/packfile"
...
...
@@ -54,5 +59,11 @@ func Viper(path ...string) *viper.Viper {
fmt
.
Println
(
err
)
}
global
.
GVA_CONFIG
.
AutoCode
.
Root
,
_
=
filepath
.
Abs
(
".."
)
global
.
BlackCache
=
local_cache
.
NewCache
(
local_cache
.
SetDefaultExpire
(
time
.
Duration
(
global
.
GVA_CONFIG
.
JWT
.
ExpiresTime
)))
// 从db加载jwt数据
if
global
.
GVA_DB
!=
nil
{
system
.
LoadAll
()
}
return
v
}
server/global/global.go
浏览文件 @
3ec0a7cf
...
...
@@ -2,6 +2,7 @@ package global
import
(
"github.com/flipped-aurora/gin-vue-admin/server/utils/timer"
"github.com/songzhibin97/gkit/cache/local_cache"
"golang.org/x/sync/singleflight"
...
...
@@ -23,4 +24,6 @@ var (
GVA_LOG
*
zap
.
Logger
GVA_Timer
timer
.
Timer
=
timer
.
NewTimerTask
()
GVA_Concurrency_Control
=
&
singleflight
.
Group
{}
BlackCache
local_cache
.
Cache
)
server/go.mod
浏览文件 @
3ec0a7cf
...
...
@@ -28,8 +28,9 @@ require (
github.com/tencentyun/cos-go-sdk-v5 v0.7.19
github.com/unrolled/secure v1.0.7
github.com/xuri/excelize/v2 v2.4.1
go.uber.org/zap v1.1
0
.0
go.uber.org/zap v1.1
6
.0
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
gorm.io/driver/mysql v1.0.1
gorm.io/gorm v1.20.7
nhooyr.io/websocket v1.8.6
)
server/initialize/timer.go
浏览文件 @
3ec0a7cf
...
...
@@ -10,7 +10,7 @@ import (
func
Timer
()
{
if
global
.
GVA_CONFIG
.
Timer
.
Start
{
for
_
,
detail
:=
range
global
.
GVA_CONFIG
.
Timer
.
Detail
{
for
i
:=
range
global
.
GVA_CONFIG
.
Timer
.
Detail
{
go
func
(
detail
config
.
Detail
)
{
global
.
GVA_Timer
.
AddTaskByFunc
(
"ClearDB"
,
global
.
GVA_CONFIG
.
Timer
.
Spec
,
func
()
{
err
:=
utils
.
ClearTable
(
global
.
GVA_DB
,
detail
.
TableName
,
detail
.
CompareField
,
detail
.
Interval
)
...
...
@@ -18,7 +18,7 @@ func Timer() {
fmt
.
Println
(
"timer error:"
,
err
)
}
})
}(
detail
)
}(
global
.
GVA_CONFIG
.
Timer
.
Detail
[
i
]
)
}
}
}
server/plugin/ws/utils/utils.go
0 → 100644
浏览文件 @
3ec0a7cf
package
utils
import
(
"github.com/flipped-aurora/gin-vue-admin/server/global"
systemReq
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
"github.com/gin-gonic/gin"
uuid
"github.com/satori/go.uuid"
)
// 从Gin的Context中获取从jwt解析出来的用户ID
func
GetUserID
(
c
*
gin
.
Context
)
uint
{
if
claims
,
exists
:=
c
.
Get
(
"claims"
);
!
exists
{
global
.
GVA_LOG
.
Error
(
"从Gin的Context中获取从jwt解析出来的用户ID失败, 请检查路由是否使用jwt中间件!"
)
return
0
}
else
{
waitUse
:=
claims
.
(
*
systemReq
.
CustomClaims
)
return
waitUse
.
ID
}
}
// 从Gin的Context中获取从jwt解析出来的用户UUID
func
GetUserUuid
(
c
*
gin
.
Context
)
uuid
.
UUID
{
if
claims
,
exists
:=
c
.
Get
(
"claims"
);
!
exists
{
global
.
GVA_LOG
.
Error
(
"从Gin的Context中获取从jwt解析出来的用户UUID失败, 请检查路由是否使用jwt中间件!"
)
return
uuid
.
UUID
{}
}
else
{
waitUse
:=
claims
.
(
*
systemReq
.
CustomClaims
)
return
waitUse
.
UUID
}
}
// 从Gin的Context中获取从jwt解析出来的用户角色id
func
GetUserAuthorityId
(
c
*
gin
.
Context
)
string
{
if
claims
,
exists
:=
c
.
Get
(
"claims"
);
!
exists
{
global
.
GVA_LOG
.
Error
(
"从Gin的Context中获取从jwt解析出来的用户UUID失败, 请检查路由是否使用jwt中间件!"
)
return
""
}
else
{
waitUse
:=
claims
.
(
*
systemReq
.
CustomClaims
)
return
waitUse
.
AuthorityId
}
}
// 从Gin的Context中获取从jwt解析出来的用户角色id
func
GetUserInfo
(
c
*
gin
.
Context
)
*
systemReq
.
CustomClaims
{
if
claims
,
exists
:=
c
.
Get
(
"claims"
);
!
exists
{
global
.
GVA_LOG
.
Error
(
"从Gin的Context中获取从jwt解析出来的用户UUID失败, 请检查路由是否使用jwt中间件!"
)
return
nil
}
else
{
waitUse
:=
claims
.
(
*
systemReq
.
CustomClaims
)
return
waitUse
}
}
server/plugin/ws/ws.go
0 → 100644
浏览文件 @
3ec0a7cf
package
ws
import
(
"github.com/flipped-aurora/ws/core/biz"
"github.com/flipped-aurora/ws/core/data"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"nhooyr.io/websocket"
)
type
wsPlugin
struct
{
logger
*
zap
.
Logger
// 日志输出对象
manageBuf
int64
// buffer
registeredMsgHandler
map
[
int32
]
func
(
biz
.
IMessage
)
bool
// 消息处理
checkMap
map
[
string
]
biz
.
CheckFunc
// 用户校验
admin
biz
.
IManage
adminCase
*
biz
.
AdminCase
}
func
DefaultRegisteredMsgHandler
(
admin
biz
.
IManage
,
logger
*
zap
.
Logger
)
map
[
int32
]
func
(
biz
.
IMessage
)
bool
{
return
map
[
int32
]
func
(
msg
biz
.
IMessage
)
bool
{
1
:
func
(
msg
biz
.
IMessage
)
bool
{
// w.admin 里面找到注册客户端的方法
client
,
ok
:=
admin
.
FindClient
(
msg
.
GetTo
())
if
!
ok
{
logger
.
Info
(
"没有找到该用户"
)
return
false
}
return
client
.
SendMes
(
msg
)
},
}
}
func
DefaultCheckMap
()
map
[
string
]
biz
.
CheckFunc
{
return
map
[
string
]
biz
.
CheckFunc
{
"gva_ws"
:
func
(
c
interface
{})
(
string
,
bool
)
{
// 先断言是gin.content
cc
,
ok
:=
c
.
(
*
gin
.
Context
)
if
!
ok
{
return
""
,
false
}
token
:=
cc
.
Query
(
"jwt"
)
// 可以携带jwt
if
len
(
token
)
==
0
{
return
""
,
false
}
// 解析 jwt...
return
token
,
true
},
}
}
func
(
w
*
wsPlugin
)
Register
(
g
*
gin
.
RouterGroup
)
{
// gva_ws 为身份校验函数
g
.
GET
(
"/ws"
,
w
.
adminCase
.
HandlerWS
(
"gva_ws"
,
&
websocket
.
AcceptOptions
{
InsecureSkipVerify
:
true
,
}))
g
.
POST
(
"/sendMsg"
,
w
.
adminCase
.
SendMsg
(
"gva_ws"
))
}
func
(
w
*
wsPlugin
)
RouterPath
()
string
{
return
"gva_ws"
}
func
GenerateWs
(
logger
*
zap
.
Logger
,
manageBuf
int64
,
checkMap
map
[
string
]
biz
.
CheckFunc
)
*
wsPlugin
{
m
:=
data
.
NewManage
(
manageBuf
)
t
:=
data
.
NewTopic
()
h
:=
data
.
NewHandle
()
admin
:=
data
.
NewAdmin
(
m
,
t
,
h
,
logger
)
for
s
,
checkFunc
:=
range
checkMap
{
admin
.
AddCheckFunc
(
s
,
checkFunc
)
}
registeredMsgHandler
:=
DefaultRegisteredMsgHandler
(
admin
,
logger
)
for
key
,
handler
:=
range
registeredMsgHandler
{
admin
.
RegisteredMsgHandler
(
key
,
handler
)
}
return
&
wsPlugin
{
logger
:
logger
,
manageBuf
:
manageBuf
,
registeredMsgHandler
:
registeredMsgHandler
,
checkMap
:
checkMap
,
admin
:
admin
,
adminCase
:
biz
.
NewAdmin
(
admin
)}
}
server/service/system/jwt_black_list.go
浏览文件 @
3ec0a7cf
...
...
@@ -2,13 +2,10 @@ package system
import
(
"context"
"errors"
"time"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/system"
"gorm.io/gorm"
)
type
JwtService
struct
{
...
...
@@ -22,6 +19,11 @@ type JwtService struct {
func
(
jwtService
*
JwtService
)
JsonInBlacklist
(
jwtList
system
.
JwtBlacklist
)
(
err
error
)
{
err
=
global
.
GVA_DB
.
Create
(
&
jwtList
)
.
Error
if
err
!=
nil
{
return
}
global
.
BlackCache
.
SetDefault
(
jwtList
.
Jwt
,
struct
{
}{})
return
}
...
...
@@ -32,9 +34,11 @@ func (jwtService *JwtService) JsonInBlacklist(jwtList system.JwtBlacklist) (err
//@return: bool
func
(
jwtService
*
JwtService
)
IsBlacklist
(
jwt
string
)
bool
{
err
:=
global
.
GVA_DB
.
Where
(
"jwt = ?"
,
jwt
)
.
First
(
&
system
.
JwtBlacklist
{})
.
Error
isNotFound
:=
errors
.
Is
(
err
,
gorm
.
ErrRecordNotFound
)
return
!
isNotFound
_
,
ok
:=
global
.
BlackCache
.
Get
(
jwt
)
return
ok
//err := global.GVA_DB.Where("jwt = ?", jwt).First(&system.JwtBlacklist{}).Error
//isNotFound := errors.Is(err, gorm.ErrRecordNotFound)
//return !isNotFound
}
//@author: [piexlmax](https://github.com/piexlmax)
...
...
@@ -60,3 +64,15 @@ func (jwtService *JwtService) SetRedisJWT(jwt string, userName string) (err erro
err
=
global
.
GVA_REDIS
.
Set
(
context
.
Background
(),
userName
,
jwt
,
timer
)
.
Err
()
return
err
}
func
LoadAll
()
{
var
data
[]
string
err
:=
global
.
GVA_DB
.
Find
(
&
system
.
JwtBlacklist
{})
.
Select
(
"jwt"
)
.
Find
(
&
data
)
.
Error
if
err
!=
nil
{
// 从db加载jwt数据
for
i
:=
range
data
{
global
.
BlackCache
.
SetDefault
(
data
[
i
],
struct
{
}{})
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录