forked from kevin/meshtastic_mqtt_server
安全加固:LLM 会话按 (bot,peer) 隔离+历史上限50条,LLM 入队按 (bot,from_node) 限流(60s内5条),瓦片磁盘缓存单源配额(3000文件/300MB 按mtime淘汰),签到墙读接口限速+全站每日1000条封顶,敏感数据落盘 AES-256-GCM 加密(MESH_SECRET_KEY, 兼容明文迁移),admin 改密需验证当前密码+pwd_version 会话撤销,后端 v1.5.0
This commit is contained in:
+11
-2
@@ -43,6 +43,7 @@ type SessionClaims struct {
|
||||
UserID uint64 `json:"user_id"`
|
||||
Username string `json:"username"`
|
||||
Role string `json:"role"`
|
||||
PwdVer int64 `json:"pwd_ver"`
|
||||
Expires int64 `json:"expires"`
|
||||
}
|
||||
|
||||
@@ -87,7 +88,7 @@ func AdminUserResponse(user store.UserRecord) AdminUserDTO {
|
||||
|
||||
// NewCookie 为已登录用户构造一份带签名的 session cookie。
|
||||
func (sm *Manager) NewCookie(user store.UserRecord) (*http.Cookie, error) {
|
||||
claims := SessionClaims{UserID: user.ID, Username: user.Username, Role: user.Role, Expires: time.Now().Add(sm.ttl).Unix()}
|
||||
claims := SessionClaims{UserID: user.ID, Username: user.Username, Role: user.Role, PwdVer: user.PwdVersion, Expires: time.Now().Add(sm.ttl).Unix()}
|
||||
data, err := json.Marshal(claims)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -155,7 +156,9 @@ func (sm *Manager) sign(payload string) string {
|
||||
}
|
||||
|
||||
// RequireAdmin 是把校验结果挂在 c.Set(AdminClaimsKey, claims) 上的中间件。
|
||||
func RequireAdmin(sm *Manager) gin.HandlerFunc {
|
||||
// 除签名/过期校验外,还会对照 DB 中用户当前的 pwd_version:
|
||||
// 改密后旧会话(claims.PwdVer 低于当前版本)立即失效。
|
||||
func RequireAdmin(sm *Manager, store *store.Store) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
claims, err := sm.ClaimsFromRequest(c)
|
||||
if err != nil {
|
||||
@@ -163,6 +166,12 @@ func RequireAdmin(sm *Manager) gin.HandlerFunc {
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
user, err := store.GetUserByUsername(claims.Username)
|
||||
if err != nil || user.Role != AdminRole || user.PwdVersion != claims.PwdVer {
|
||||
c.JSON(http.StatusUnauthorized, gin.H{"error": "admin login required"})
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
c.Set(AdminClaimsKey, claims)
|
||||
c.Next()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user