Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 0 additions & 24 deletions pkg/config/gormdb/casbin.go

This file was deleted.

8 changes: 4 additions & 4 deletions pkg/config/gormdb/gorm.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func (e *Database) Init() {
if e.CasbinModel != "" {
//set casbin adapter
var a persist.Adapter
a, err = gormadapter.NewAdapterByDBWithCustomTable(DB, &CasbinRule{})
a, err = gormadapter.NewAdapterByDBUseTableName(DB, "mss_boot", "casbin_rule")
if err != nil {
log.Fatalf("gormadapter.NewAdapterByDB error : %s", err.Error())
}
Expand All @@ -112,8 +112,8 @@ func (e *Database) Init() {
if err != nil {
log.Fatalf("Enforcer.LoadPolicy error : %s", err.Error())
}
//Enforcer.EnableAutoSave(true)
//Enforcer.EnableAutoBuildRoleLinks(true)
//Enforcer.EnableLog(true)
Enforcer.EnableAutoSave(true)
Enforcer.EnableAutoBuildRoleLinks(true)
Enforcer.EnableLog(true)
}
}
10 changes: 8 additions & 2 deletions pkg/config/gormdb/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ import (
"gorm.io/gorm/utils"
)

var log loggerCore.Logger

func init() {
log = loggerCore.NewLogger()
}

// Colors
const (
Reset = "\033[0m"
Expand All @@ -36,11 +42,11 @@ type gormLogger struct {
func (l *gormLogger) getLogger(ctx context.Context) loggerCore.Logger {
requestID := ctx.Value("X-Request-ID")
if requestID != nil {
return loggerCore.DefaultLogger.Fields(map[string]interface{}{
return log.Fields(map[string]interface{}{
"x-request-id": requestID,
})
}
return loggerCore.DefaultLogger
return log
}

// LogMode log mode
Expand Down
83 changes: 83 additions & 0 deletions pkg/middlewares/auth.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package middlewares

/*
* @Author: lwnmengjing<lwnmengjing@qq.com>
* @Date: 2022/4/13 22:44
* @Last Modified by: lwnmengjing<lwnmengjing@qq.com>
* @Last Modified time: 2022/4/13 22:44
*/

import (
"errors"
"net/http"
"strings"

"github.com/coreos/go-oidc/v3/oidc"
"github.com/gin-gonic/gin"

"github.com/mss-boot-io/mss-boot/pkg/response"
"github.com/mss-boot-io/mss-boot/pkg/store"
)

// AuthMiddleware 认证中间件
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
api := response.Make(c)
//登录认证
accessToken := getTokenFromHeader(c)
if accessToken == "" {
api.AddError(errors.New("token is empty"))
api.Err(http.StatusUnauthorized)
return
}
client, err := store.DefaultOAuth2Store.
GetClientByDomain(c.Request.Context(), c.Request.Host)
if err != nil {
api.AddError(err)
api.Err(http.StatusUnauthorized)
return
}
provider, err := oidc.NewProvider(c, client.GetIssuer())
if err != nil {
api.AddError(err)
api.Err(http.StatusUnauthorized)
return
}
idTokenVerifier := provider.Verifier(&oidc.Config{ClientID: client.GetClientID()})
idToken, err := idTokenVerifier.Verify(c, accessToken)
if err != nil {
api.AddError(err)
api.Err(http.StatusUnauthorized)
return
}
user := &User{}
err = idToken.Claims(user)
if err != nil {
api.AddError(err)
api.Err(http.StatusUnauthorized)
return
}
//鉴权
c.Set("user", user)
c.Next()
}
}

// getTokenFromHeader 获取token
func getTokenFromHeader(c *gin.Context) string {
return strings.ReplaceAll(strings.ReplaceAll(
c.GetHeader("Authorization"),
"Bearer ",
""),
"bearer",
"")
}

// GetLoginUser 获取登录用户
func GetLoginUser(c *gin.Context) *User {
user, ok := c.Get("user")
if !ok {
return nil
}
return user.(*User)
}
8 changes: 7 additions & 1 deletion pkg/response/actions/get_gorm.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ package actions
*/

import (
"errors"
"gorm.io/gorm"
"net/http"

"github.com/gin-gonic/gin"
Expand All @@ -30,8 +32,12 @@ func NewGetGorm(m schema.Tabler, key string) *Get {
func (e *Get) getGorm(c *gin.Context, key string) {
api := response.Make(c)
m := pkg.TablerDeepCopy(e.ModelGorm)
err := gormdb.DB.First(m, c.Param(key)).Error
err := gormdb.DB.First(m, "id = ?", c.Param(key)).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
api.Err(http.StatusNotFound)
return
}
api.Log.Error(err)
api.AddError(err)
api.Err(http.StatusInternalServerError)
Expand Down
4 changes: 2 additions & 2 deletions pkg/response/actions/get_mgm.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ func (*Get) String() string {
// Handler action handler
func (e *Get) Handler() gin.HandlerFunc {
return func(c *gin.Context) {
if e.ModelMgm != nil {
e.getMgm(c, e.Key)
if e.ModelGorm != nil {
e.getGorm(c, e.Key)
return
}
if e.ModelMgm != nil {
Expand Down
5 changes: 5 additions & 0 deletions pkg/response/actions/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ type ModelGorm struct {
DeletedAt gorm.DeletedAt `gorm:"index" bson:"-" json:"-"`
}

func (e *ModelGorm) BeforeCreate(_ *gorm.DB) (err error) {
_, err = e.PrepareID(nil)
return err
}

// PrepareID prepare id
func (e *ModelGorm) PrepareID(_ any) (any, error) {
if e.ID == "" {
Expand Down
15 changes: 9 additions & 6 deletions pkg/response/antd/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type pages struct {
}

// SetCode 设置错误码
func (e *response) SetCode(code int32) {
func (e *response) SetCode(code int) {
switch code {
case 200, 0:
default:
Expand All @@ -65,14 +65,17 @@ func (e *response) SetMsg(msg ...string) {
e.ErrorMessage = strings.Join(msg, ",")
}

// SetData 设置返回数据
func (e *response) SetData(data interface{}) {
// SetList 设置返回数据
func (e *response) SetList(data interface{}) {
e.Data = data
}

// SetSuccess 设置是否成功
func (e *response) SetSuccess(success bool) {
e.Success = success
// SetStatus 设置是否成功
func (e *response) SetStatus(status string) {
switch strings.ToLower(status) {
case "ok", "success", "1", "t", "true":
e.Success = true
}
}

// Clone 复制当前对象
Expand Down
20 changes: 10 additions & 10 deletions pkg/response/model.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package response

import (
"strconv"
"strings"
)

// Response response
type Response struct {
Success bool `json:"success,omitempty"`
Status string `json:"status,omitempty"`
Code int `json:"code,omitempty"`
ErrorCode string `json:"errorCode,omitempty"`
ErrorMessage string `json:"errorMessage,omitempty"`
ShowType uint8 `json:"showType,omitempty"`
Expand All @@ -17,7 +18,7 @@ type Response struct {

type response struct {
Response
Data interface{} `json:"data"`
List interface{} `json:"list,omitempty"`
}

// Page page
Expand All @@ -32,9 +33,9 @@ type page struct {
response
}

// SetData set data
func (e *response) SetData(data interface{}) {
e.Data = data
// SetList set data
func (e *response) SetList(data interface{}) {
e.List = data
}

// Clone clone
Expand All @@ -54,11 +55,10 @@ func (e *response) SetMsg(s ...string) {
}

// SetCode set code
func (e *response) SetCode(code int32) {
e.ErrorCode = strconv.Itoa(int(code))
func (e *response) SetCode(code int) {
e.Code = code
}

// SetSuccess set success
func (e *response) SetSuccess(success bool) {
e.Success = success
func (e *response) SetStatus(status string) {
e.Status = status
}
20 changes: 9 additions & 11 deletions pkg/response/return.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ func Error(c *gin.Context, code int, err error, msg ...string) {
}
res.SetMsg(msg...)
res.SetTraceID(pkg.GenerateMsgIDFromContext(c))
res.SetCode(int32(code))
res.SetSuccess(false)
res.SetCode(code)
res.SetStatus("error")
c.Set("result", res)
c.Set("status", code)
c.AbortWithStatusJSON(code, res)
Expand All @@ -35,22 +35,20 @@ func Error(c *gin.Context, code int, err error, msg ...string) {
func OK(c *gin.Context, data interface{}, msg ...string) {
checkContext(c)
res := Default.Clone()
res.SetData(data)
res.SetSuccess(true)
res.SetMsg(msg...)
res.SetList(data)
res.SetTraceID(pkg.GenerateMsgIDFromContext(c))
switch c.Request.Method {
case http.MethodDelete:
res.SetCode(http.StatusNoContent)
c.AbortWithStatusJSON(http.StatusNoContent, res)
c.AbortWithStatusJSON(http.StatusNoContent, data)
return
case http.MethodPost:
res.SetCode(http.StatusCreated)
c.AbortWithStatusJSON(http.StatusCreated, res)
c.AbortWithStatusJSON(http.StatusCreated, data)
return
default:
res.SetCode(http.StatusOK)
c.AbortWithStatusJSON(http.StatusOK, res)
c.AbortWithStatusJSON(http.StatusOK, data)
}
}

Expand All @@ -61,10 +59,10 @@ func PageOK(c *gin.Context, result interface{}, count int64, pageIndex int64, pa
res.Count = count
res.Current = pageIndex
res.PageSize = pageSize
res.response.SetData(result)
res.response.SetMsg(msg...)
res.response.SetList(result)
//res.response.SetMsg(msg...)
res.response.SetTraceID(pkg.GenerateMsgIDFromContext(c))
res.response.SetCode(http.StatusOK)
//res.response.SetCode(http.StatusOK)
c.Set("result", res)
c.Set("status", http.StatusOK)
c.AbortWithStatusJSON(http.StatusOK, res)
Expand Down
6 changes: 3 additions & 3 deletions pkg/response/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ package response

// Responses responses
type Responses interface {
SetCode(int32)
SetCode(int)
SetTraceID(string)
SetMsg(...string)
SetData(interface{})
SetSuccess(bool)
SetList(interface{})
SetStatus(string)
Clone() Responses
}
2 changes: 1 addition & 1 deletion pkg/security/security.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ type Verifier interface {
GetRoleID() string
GetEmail() string
GetUsername() string
Verify(tenantID string, username string, password string) (bool, Verifier, error)
Verify() (bool, Verifier, error)
}
32 changes: 32 additions & 0 deletions pkg/store/oauth2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package store

/*
* @Author: lwnmengjing<lwnmengjing@qq.com>
* @Date: 2022/4/21 17:20
* @Last Modified by: lwnmengjing<lwnmengjing@qq.com>
* @Last Modified time: 2022/4/21 17:20
*/

import (
"context"

"golang.org/x/oauth2"
)

// DefaultOAuth2Store default oauth2 store
var DefaultOAuth2Store OAuth2Store

// OAuth2Store is the interface for OAuth2 configuration.
type OAuth2Store interface {
GetClientByDomain(c context.Context, domain string) (OAuth2Configure, error)
}

// OAuth2Configure is the interface for OAuth2 configuration.
type OAuth2Configure interface {
GetOAuth2Config(c context.Context) (*oauth2.Config, error)
GetIssuer() string
GetClientID() string
GetClientSecret() string
GetRedirectURL() string
GetScopes() []string
}