1
0

feat: 合并Gin_Vue

This commit is contained in:
TsMask
2023-10-16 20:04:08 +08:00
parent 55fe1d534d
commit 05c7e9b9e8
213 changed files with 20338 additions and 311 deletions

View File

@@ -8,9 +8,9 @@ import (
sysMenuService "ems.agt/features/sys_menu/service"
sysRoleService "ems.agt/features/sys_role/service"
"ems.agt/lib/core/cache"
"ems.agt/lib/core/conf"
"ems.agt/lib/core/vo"
"ems.agt/lib/dborm"
srcConfig "ems.agt/src/framework/config"
)
// 登录缓存用户信息
@@ -35,7 +35,7 @@ func CacheLoginUser(user *dborm.User) {
}
// 是否管理员
if conf.IsAdmin(loginUser.UserID) {
if srcConfig.IsAdmin(loginUser.UserID) {
loginUser.Permissions = []string{"*:*:*"}
} else {
// 获取权限标识

View File

@@ -2,51 +2,35 @@ package conf
import (
"fmt"
"time"
"github.com/spf13/viper"
)
var v *viper.Viper
// 配置文件读取
func InitConfig(configFile string) {
v = viper.New()
// 设置配置文件路径
viper.SetConfigFile(configFile)
v.SetConfigFile(configFile)
// 读取配置文件
err := viper.ReadInConfig()
err := v.ReadInConfig()
if err != nil {
fmt.Printf("读取配置文件失败: %v \n", err)
return
}
// 记录程序开始运行的时间点
viper.Set("runTime", time.Now())
}
// RunTime 程序开始运行的时间
func RunTime() time.Time {
return viper.GetTime("runTime")
}
// Get 获取配置信息
//
// Get("framework.name")
func Get(key string) any {
return viper.Get(key)
return v.Get(key)
}
// IsAdmin 用户是否为管理员
func IsAdmin(userID string) bool {
if userID == "" {
return false
}
// 从本地配置获取user信息
// admins := Get("user.adminList").([]any)
admins := []string{"1", "2", "3"}
for _, s := range admins {
if s == userID {
return true
}
}
return false
// AllSettings 全部配置信息
func AllSettings() map[string]interface{} {
return v.AllSettings()
}

View File

@@ -8,8 +8,11 @@ import (
"net/url"
"os"
"path/filepath"
"strings"
"ems.agt/lib/core/vo"
commonConstants "ems.agt/src/framework/constants/common"
tokenConst "ems.agt/src/framework/constants/token"
"github.com/gorilla/mux"
)
@@ -101,13 +104,27 @@ func SaveUploadedFile(r *http.Request, dst string) error {
/// ==== 登录用户信息, 通过中间件后预置入
// Authorization 解析请求头
func Authorization(r *http.Request) string {
authHeader := r.Header.Get(tokenConst.HEADER_KEY)
if authHeader == "" {
return ""
}
// 拆分 Authorization 请求头,提取 JWT 令牌部分
arr := strings.Split(authHeader, tokenConst.HEADER_PREFIX)
if len(arr) == 2 && arr[1] == "" {
return ""
}
return arr[1]
}
// 定义自定义类型作为键
type ContextKey string
// LoginUser 登录用户信息需要Authorize中间件
func LoginUser(r *http.Request) (vo.LoginUser, error) {
// 上下文
v := r.Context().Value(ContextKey("LoginUser"))
v := r.Context().Value(ContextKey(commonConstants.CTX_LOGIN_USER))
if v != nil {
return v.(vo.LoginUser), nil
}

View File

@@ -26,9 +26,9 @@ const (
)
var (
Version string
BuildTime string
GoVer string
Version string = "-"
BuildTime string = "-"
GoVer string = "-"
)
var (

View File

@@ -10,6 +10,8 @@ import (
"ems.agt/lib/core/vo"
"ems.agt/lib/core/vo/result"
"ems.agt/lib/dborm"
commonConstants "ems.agt/src/framework/constants/common"
tokenUtils "ems.agt/src/framework/utils/token"
)
// Authorize 用户身份授权认证校验
@@ -25,30 +27,74 @@ func Authorize(options map[string][]string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 获取请求头标识信息
tokenStr := ctx.Authorization(r)
// 获取请求头标识信息-旧头
accessToken := r.Header.Get("AccessToken")
if accessToken == "" {
ctx.JSON(w, 401, result.CodeMsg(401, "token error 无效身份授权"))
if tokenStr == "" && accessToken != "" {
// 验证令牌 == 这里直接查数据库session
if !dborm.XormExistValidToken(accessToken, 0) {
ctx.JSON(w, 401, result.CodeMsg(401, "Invalid identity authorization valid error"))
return
}
se, err := dborm.XormUpdateSessionShakeTime(accessToken)
if err != nil {
ctx.JSON(w, 401, result.CodeMsg(401, "Invalid identity authorization shake error"))
return
}
// 获取缓存的用户信息
data, ok := cache.GetLocalTTL(se.AccountId)
if data == nil || !ok {
ctx.JSON(w, 401, result.CodeMsg(401, "Invalid identity authorization info error"))
return
}
loginUser := data.(vo.LoginUser)
// 登录用户角色权限校验
if options != nil {
var roles []string
for _, item := range loginUser.User.Roles {
roles = append(roles, item.RoleKey)
}
perms := loginUser.Permissions
verifyOk := verifyRolePermission(roles, perms, options)
if !verifyOk {
msg := fmt.Sprintf("Unauthorized access %s %s", r.Method, r.RequestURI)
ctx.JSON(w, 403, result.CodeMsg(403, msg))
return
}
}
// 在请求的 Context 中存储数据
rContext := r.Context()
rContext = context.WithValue(rContext, ctx.ContextKey(commonConstants.CTX_LOGIN_USER), loginUser)
// 继续处理请求
next.ServeHTTP(w, r.WithContext(rContext))
return
}
// 验证令牌 == 这里直接查数据库session
if !dborm.XormExistValidToken(accessToken, 0) {
ctx.JSON(w, 401, result.CodeMsg(401, "valid error 无效身份授权"))
// 获取请求头标识信息
if tokenStr == "" {
ctx.JSON(w, 401, result.CodeMsg(401, "Invalid identity authorization token error"))
return
}
se, err := dborm.XormUpdateSessionShakeTime(accessToken)
// 验证令牌
claims, err := tokenUtils.Verify(tokenStr)
if err != nil {
ctx.JSON(w, 401, result.CodeMsg(401, "shake error 无效身份授权"))
ctx.JSON(w, 401, result.CodeMsg(401, "Invalid identity authorization valid error"))
return
}
// 获取缓存的用户信息
data, ok := cache.GetLocalTTL(se.AccountId)
if data == nil || !ok {
ctx.JSON(w, 401, result.CodeMsg(401, "info error 无效身份授权"))
loginUser := tokenUtils.LoginUser(claims)
if loginUser.UserID == "" {
ctx.JSON(w, 401, result.CodeMsg(401, "Invalid identity authorization shake error"))
return
}
loginUser := data.(vo.LoginUser)
// 检查刷新有效期后存入上下文
tokenUtils.RefreshIn(&loginUser)
// 登录用户角色权限校验
if options != nil {
@@ -59,7 +105,7 @@ func Authorize(options map[string][]string) func(http.Handler) http.Handler {
perms := loginUser.Permissions
verifyOk := verifyRolePermission(roles, perms, options)
if !verifyOk {
msg := fmt.Sprintf("无权访问 %s %s", r.Method, r.RequestURI)
msg := fmt.Sprintf("Unauthorized access %s %s", r.Method, r.RequestURI)
ctx.JSON(w, 403, result.CodeMsg(403, msg))
return
}
@@ -67,7 +113,7 @@ func Authorize(options map[string][]string) func(http.Handler) http.Handler {
// 在请求的 Context 中存储数据
rContext := r.Context()
rContext = context.WithValue(rContext, ctx.ContextKey("LoginUser"), loginUser)
rContext = context.WithValue(rContext, ctx.ContextKey(commonConstants.CTX_LOGIN_USER), loginUser)
// 继续处理请求
next.ServeHTTP(w, r.WithContext(rContext))
})

View File

@@ -6,6 +6,7 @@ import (
"ems.agt/lib/log"
"ems.agt/lib/services"
tokenConst "ems.agt/src/framework/constants/token"
"github.com/gorilla/mux"
)
@@ -22,6 +23,7 @@ func LoggerTrace(next http.Handler) http.Handler {
log.Trace(" User-Agent:", r.Header.Get("User-Agent"))
log.Trace(" Content-Type:", r.Header.Get("Content-Type"))
log.Trace(" AccessToken:", r.Header.Get("AccessToken"))
log.Trace(" Authorization:", r.Header.Get(tokenConst.HEADER_KEY))
log.Trace("Trace End=====")
//body, _ := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen))
// nop-close to ready r.Body !!!

View File

@@ -15,6 +15,7 @@ import (
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/run"
tokenConst "ems.agt/src/framework/constants/token"
"github.com/go-resty/resty/v2"
)
@@ -36,14 +37,15 @@ type MmlCommand struct {
}
type MmlVar struct {
Version string `json:"version"`
Output string `json:"output"`
MmlHome string `json:"mmlHome"`
Limit int `json:"limit"`
User string `json:"user"`
SessionToken string `josn:"sessionToken"`
HttpUri string `json:"httpUri"`
UserAgent string `json:"userAgent"`
Version string `json:"version"`
Output string `json:"output"`
MmlHome string `json:"mmlHome"`
Limit int `json:"limit"`
User string `json:"user"`
SessionToken string `josn:"sessionToken"`
Authorization string `josn:"authorization"`
HttpUri string `json:"httpUri"`
UserAgent string `json:"userAgent"`
}
// func init() {
@@ -504,6 +506,7 @@ func TransMml2HttpReq(omcMmlVar *MmlVar, mml *MmlCommand) (*[]byte, error) {
log.Debugf("method: Get requestURI: %s", requestURI)
response, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: omcMmlVar.Authorization}).
SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}).
SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
@@ -520,6 +523,7 @@ func TransMml2HttpReq(omcMmlVar *MmlVar, mml *MmlCommand) (*[]byte, error) {
log.Debugf("method: Post requestURI: %s", requestURI)
response, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: omcMmlVar.Authorization}).
SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}).
SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
@@ -553,6 +557,7 @@ func TransMml2HttpReq(omcMmlVar *MmlVar, mml *MmlCommand) (*[]byte, error) {
body := ParseInputBody(inputJson, mml)
response, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: omcMmlVar.Authorization}).
SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}).
SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
@@ -569,6 +574,7 @@ func TransMml2HttpReq(omcMmlVar *MmlVar, mml *MmlCommand) (*[]byte, error) {
log.Debugf("method: Delete requestURI: %s", requestURI)
response, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: omcMmlVar.Authorization}).
SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}).
SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
@@ -584,6 +590,7 @@ func TransMml2HttpReq(omcMmlVar *MmlVar, mml *MmlCommand) (*[]byte, error) {
log.Debugf("method: patch requestURI: %s", requestURI)
response, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: omcMmlVar.Authorization}).
SetHeaders(map[string]string{"accessToken": omcMmlVar.SessionToken}).
SetHeaders(map[string]string{"User-Agent": omcMmlVar.UserAgent}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
@@ -764,12 +771,19 @@ func ParseOutputResponse(omcMmlVar *MmlVar, outputJson *dborm.MmlOutput, respons
output = *ParseErrorOutput(string(response.Body()))
} else {
log.Trace("mapResults:", mapResults)
errResult := mapResults["error"]
log.Trace("errResult:", errResult)
if len(errResult.(map[string]interface{})) > 0 {
errCode, _ := strconv.Atoi(fmt.Sprintf("%v", errResult.(map[string]interface{})["errorCode"]))
errorInfo := errResult.(map[string]interface{})["errorInfo"]
if v, ok := mapResults["error"]; ok {
vMap := v.(map[string]interface{})
if len(vMap) > 0 {
errCode, _ := strconv.Atoi(fmt.Sprintf("%v", vMap["errorCode"]))
errorInfo := vMap["errorInfo"]
output = []byte(fmt.Sprintf(outputJson.ErrMsg, errCode, errorInfo))
}
} else if v, ok := mapResults["code"]; ok {
errCode, _ := strconv.Atoi(fmt.Sprintf("%v", v))
errorInfo := mapResults["msg"]
output = []byte(fmt.Sprintf(outputJson.ErrMsg, errCode, errorInfo))
} else {
output = []byte(fmt.Sprintf("%v", mapResults))
}
}
}

View File

@@ -17,6 +17,7 @@ import (
"ems.agt/features/nbi"
"ems.agt/features/pm"
"ems.agt/features/security"
"ems.agt/features/sm"
"ems.agt/features/state"
sysconfig "ems.agt/features/sys_config"
sysdictdata "ems.agt/features/sys_dict_data"
@@ -66,6 +67,9 @@ func init() {
Register("GET", state.CustomUriLicenseInfoAll, state.GetAllLicenseInfoFromNF, nil)
Register("GET", state.CustomUriLicenseInfoOne, state.GetOneLicenseInfoFromNF, nil)
Register("GET", sm.UriOMCLocalTime, sm.GetOMCLocalTime, nil)
Register("GET", sm.CustomUriOMCLocalTime, sm.GetOMCLocalTime, nil)
// 数据库直连操作权限
selectPermission := midware.Authorize(map[string][]string{
"hasRoles": {"dba"},
@@ -364,12 +368,12 @@ func NewRouter() *mux.Router {
r := mux.NewRouter()
// set custom handle for status 404/405
r.NotFoundHandler = services.CustomResponseNotFound404Handler()
r.MethodNotAllowedHandler = services.CustomResponseMethodNotAllowed405Handler()
// r.NotFoundHandler = services.CustomResponseNotFound404Handler()
// r.MethodNotAllowedHandler = services.CustomResponseMethodNotAllowed405Handler()
r.Use(midware.LoggerTrace)
r.Use(midware.Cors)
//r.Use(midware.OptionProcess)
// r.Use(midware.Cors)
// r.Use(midware.OptionProcess)
// r.Use(midware.ArrowIPAddr)
for _, router := range routers {