Some checks failed
Go / build (.exe, 386, windows, windows-386) (push) Has been cancelled
Go / build (.exe, amd64, windows, windows-amd64) (push) Has been cancelled
Go / build (.exe, arm64, windows, windows-arm64) (push) Has been cancelled
Go / build (386, freebsd, freebsd-386) (push) Has been cancelled
Go / build (386, linux, linux-386) (push) Has been cancelled
Go / build (386, netbsd, netbsd-386) (push) Has been cancelled
Go / build (386, openbsd, openbsd-386) (push) Has been cancelled
Go / build (386, plan9, plan9-386) (push) Has been cancelled
Go / build (amd64, darwin, darwin-amd64) (push) Has been cancelled
Go / build (amd64, dragonfly, dragonfly-amd64) (push) Has been cancelled
Go / build (amd64, freebsd, freebsd-amd64) (push) Has been cancelled
Go / build (amd64, illumos, illumos-amd64) (push) Has been cancelled
Go / build (amd64, linux, linux-amd64) (push) Has been cancelled
Go / build (amd64, netbsd, netbsd-amd64) (push) Has been cancelled
Go / build (amd64, openbsd, openbsd-amd64) (push) Has been cancelled
Go / build (amd64, plan9, plan9-amd64) (push) Has been cancelled
Go / build (amd64, solaris, solaris-amd64) (push) Has been cancelled
Go / build (arm, 6, linux, linux-armv6) (push) Has been cancelled
Go / build (arm, 7, linux, linux-armv7) (push) Has been cancelled
Go / build (arm, freebsd, freebsd-arm) (push) Has been cancelled
Go / build (arm, netbsd, netbsd-arm) (push) Has been cancelled
Go / build (arm, openbsd, openbsd-arm) (push) Has been cancelled
Go / build (arm, plan9, plan9-arm) (push) Has been cancelled
Go / build (arm64, darwin, darwin-arm64) (push) Has been cancelled
Go / build (arm64, freebsd, freebsd-arm64) (push) Has been cancelled
Go / build (arm64, linux, linux-arm64) (push) Has been cancelled
Go / build (arm64, netbsd, netbsd-arm64) (push) Has been cancelled
Go / build (arm64, openbsd, openbsd-arm64) (push) Has been cancelled
Go / build (loong64, linux, linux-loong64) (push) Has been cancelled
Go / build (mips, linux, linux-mips) (push) Has been cancelled
Go / build (mips64, linux, linux-mips64) (push) Has been cancelled
Go / build (mips64le, linux, linux-mips64le) (push) Has been cancelled
Go / build (mipsle, linux, linux-mipsle) (push) Has been cancelled
Go / build (ppc64, aix, aix-ppc64) (push) Has been cancelled
Go / build (ppc64, linux, linux-ppc64) (push) Has been cancelled
Go / build (ppc64, openbsd, openbsd-ppc64) (push) Has been cancelled
Go / build (ppc64le, linux, linux-ppc64le) (push) Has been cancelled
Go / build (riscv64, freebsd, freebsd-riscv64) (push) Has been cancelled
Go / build (riscv64, linux, linux-riscv64) (push) Has been cancelled
Go / build (riscv64, openbsd, openbsd-riscv64) (push) Has been cancelled
Go / build (s390x, linux, linux-s390x) (push) Has been cancelled
Docker Image / docker (push) Has been cancelled
Go / merge-artifacts (push) Has been cancelled
61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
// cmd/gateway/admin_sessions.go 提供 Admin API 认证中间件使用的内存会话管理器。
|
|
|
|
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/tursom/mc-gateway/internal/adminhttp"
|
|
"github.com/tursom/mc-gateway/internal/adminsession"
|
|
"github.com/tursom/mc-gateway/internal/adminuser"
|
|
)
|
|
|
|
var adminSessionManager = adminsession.NewManager()
|
|
|
|
func createSession(username, role string) (adminsession.Session, error) {
|
|
return adminSessionManager.Create(username, role, adminStartup.SessionTTL)
|
|
}
|
|
|
|
func getSession(token string) (adminsession.Session, bool) {
|
|
return adminSessionManager.Get(token)
|
|
}
|
|
|
|
func deleteSession(token string) {
|
|
adminSessionManager.Delete(token)
|
|
}
|
|
|
|
func removeSessionsForUser(username string) {
|
|
adminSessionManager.RemoveUser(username)
|
|
}
|
|
|
|
func sessionFromRequest(r *http.Request) (adminsession.Session, bool) {
|
|
auth := r.Header.Get("Authorization")
|
|
token, ok := strings.CutPrefix(auth, "Bearer ")
|
|
if !ok || strings.TrimSpace(token) == "" {
|
|
return adminsession.Session{}, false
|
|
}
|
|
return getSession(strings.TrimSpace(token))
|
|
}
|
|
|
|
func requireSession(w http.ResponseWriter, r *http.Request) (adminsession.Session, bool) {
|
|
session, ok := sessionFromRequest(r)
|
|
if !ok {
|
|
adminhttp.WriteAPIError(w, http.StatusUnauthorized, "login required")
|
|
return adminsession.Session{}, false
|
|
}
|
|
return session, true
|
|
}
|
|
|
|
func requireRole(w http.ResponseWriter, r *http.Request, role string) (adminsession.Session, bool) {
|
|
session, ok := requireSession(w, r)
|
|
if !ok {
|
|
return adminsession.Session{}, false
|
|
}
|
|
if !adminuser.HasRole(session.Role, role) {
|
|
adminhttp.WriteAPIError(w, http.StatusForbidden, "permission denied")
|
|
return adminsession.Session{}, false
|
|
}
|
|
return session, true
|
|
}
|