fix issues

This commit is contained in:
yanghao05
2023-02-07 11:45:23 +08:00
parent ed3e7e3bbf
commit 2d52491536
7 changed files with 48 additions and 23 deletions

View File

@@ -25,16 +25,16 @@ func NewMigrationSeeder() contracts.Seeder {
} }
func (s *MigrationSeeder) Run(faker *gofakeit.Faker, db *gorm.DB) { func (s *MigrationSeeder) Run(faker *gofakeit.Faker, db *gorm.DB) {
times := 10 // times := 10
for i := 0; i < times; i++ { // for i := 0; i < times; i++ {
data := s.Generate(faker, i) // data := s.Generate(faker, i)
if i == 0 { // if i == 0 {
stmt := &gorm.Statement{DB: db} // stmt := &gorm.Statement{DB: db}
_ = stmt.Parse(&data) // _ = stmt.Parse(&data)
log.Printf("seeding %s for %d times", stmt.Schema.Table, times) // log.Printf("seeding %s for %d times", stmt.Schema.Table, times)
} // }
db.Create(&data) // db.Create(&data)
} // }
} }
func (s *MigrationSeeder) Generate(faker *gofakeit.Faker, idx int) models.Migration { func (s *MigrationSeeder) Generate(faker *gofakeit.Faker, idx int) models.Migration {

2
go.mod
View File

@@ -25,6 +25,7 @@ require (
go.uber.org/zap v1.21.0 go.uber.org/zap v1.21.0
golang.org/x/crypto v0.5.0 golang.org/x/crypto v0.5.0
golang.org/x/sync v0.1.0 golang.org/x/sync v0.1.0
google.golang.org/protobuf v1.28.1
gorm.io/driver/mysql v1.4.1 gorm.io/driver/mysql v1.4.1
gorm.io/gen v0.3.19 gorm.io/gen v0.3.19
gorm.io/gorm v1.24.0 gorm.io/gorm v1.24.0
@@ -85,7 +86,6 @@ require (
golang.org/x/sys v0.4.0 // indirect golang.org/x/sys v0.4.0 // indirect
golang.org/x/text v0.6.0 // indirect golang.org/x/text v0.6.0 // indirect
golang.org/x/tools v0.1.12 // indirect golang.org/x/tools v0.1.12 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect

View File

@@ -1,23 +1,38 @@
package controller package controller
import ( import (
"atom/providers/config" "atom/providers/jwt"
"atom/providers/rbac"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type PermissionController interface { type PermissionController interface {
GetName(*gin.Context) (string, error) Get(ctx *gin.Context) (string, error)
} }
type permissionControllerImpl struct { type permissionControllerImpl struct {
conf *config.Config jwt *jwt.JWT
rbac rbac.IRbac
} }
func NewPermissionController(conf *config.Config) PermissionController { func NewPermissionController(
return &permissionControllerImpl{conf: conf} jwt *jwt.JWT,
rbac rbac.IRbac,
) PermissionController {
return &permissionControllerImpl{rbac: rbac, jwt: jwt}
} }
func (c *permissionControllerImpl) GetName(ctx *gin.Context) (string, error) { func (c *permissionControllerImpl) Get(ctx *gin.Context) (string, error) {
return "Permission",nil claims, err := c.jwt.GetClaims(ctx)
if err != nil {
return "", err
}
perm, err := c.rbac.JsonPermissionsForUser(claims.Username)
if err != nil {
return "", err
}
return perm, nil
} }

View File

@@ -70,7 +70,7 @@ func (r *Route) Register() {
permissionGroup := group.Group("permission") permissionGroup := group.Group("permission")
{ {
permissionGroup.GET("/permissions", gen.DataFunc(r.permission.GetName)) permissionGroup.GET("/permissions", gen.DataFunc(r.permission.Get))
} }
} }

View File

@@ -14,6 +14,11 @@ import (
"golang.org/x/sync/singleflight" "golang.org/x/sync/singleflight"
) )
const (
CtxKey = "claims"
HttpHeader = "Authorization"
)
func init() { func init() {
if err := container.Container.Provide(NewJWT); err != nil { if err := container.Container.Provide(NewJWT); err != nil {
log.Fatal(err) log.Fatal(err)
@@ -118,7 +123,7 @@ func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) {
} }
func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) { func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) {
token := c.Request.Header.Get("Authorization") token := c.Request.Header.Get(HttpHeader)
claims, err := j.ParseToken(token) claims, err := j.ParseToken(token)
if err != nil { if err != nil {
log.Error("从Gin的Context中获取从jwt解析信息失败, 请检查请求头是否存在 Authorization 且 Claims 为规定结构") log.Error("从Gin的Context中获取从jwt解析信息失败, 请检查请求头是否存在 Authorization 且 Claims 为规定结构")
@@ -128,7 +133,7 @@ func (j *JWT) GetClaims(c *gin.Context) (*CustomClaims, error) {
// GetUserID 从Gin的Context中获取从jwt解析出来的用户ID // GetUserID 从Gin的Context中获取从jwt解析出来的用户ID
func (j *JWT) GetUserID(c *gin.Context) uint64 { func (j *JWT) GetUserID(c *gin.Context) uint64 {
if claims, exists := c.Get("claims"); !exists { if claims, exists := c.Get(CtxKey); !exists {
if cl, err := j.GetClaims(c); err != nil { if cl, err := j.GetClaims(c); err != nil {
return 0 return 0
} else { } else {
@@ -142,7 +147,7 @@ func (j *JWT) GetUserID(c *gin.Context) uint64 {
// GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID // GetUserUuid 从Gin的Context中获取从jwt解析出来的用户UUID
func (j *JWT) GetUserUuid(c *gin.Context) string { func (j *JWT) GetUserUuid(c *gin.Context) string {
if claims, exists := c.Get("claims"); !exists { if claims, exists := c.Get(CtxKey); !exists {
if cl, err := j.GetClaims(c); err != nil { if cl, err := j.GetClaims(c); err != nil {
return uuid.UUID{}.String() return uuid.UUID{}.String()
} else { } else {
@@ -156,7 +161,7 @@ func (j *JWT) GetUserUuid(c *gin.Context) string {
// GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id // GetUserAuthorityId 从Gin的Context中获取从jwt解析出来的用户角色id
func (j *JWT) GetRoleId(c *gin.Context) uint64 { func (j *JWT) GetRoleId(c *gin.Context) uint64 {
if claims, exists := c.Get("claims"); !exists { if claims, exists := c.Get(CtxKey); !exists {
if cl, err := j.GetClaims(c); err != nil { if cl, err := j.GetClaims(c); err != nil {
return 0 return 0
} else { } else {

View File

@@ -71,6 +71,10 @@ func (cb *Casbin) Reload() error {
return nil return nil
} }
func (cb *Casbin) JsonPermissionsForUser(username string) (string, error) {
return casbin.CasbinJsGetPermissionForUser(cb.enforcer, username)
}
func (cb *Casbin) Update(roleID uint, infos []CasbinInfo) error { func (cb *Casbin) Update(roleID uint, infos []CasbinInfo) error {
roleIdStr := strconv.Itoa(int(roleID)) roleIdStr := strconv.Itoa(int(roleID))
cb.Clear(0, roleIdStr) cb.Clear(0, roleIdStr)

View File

@@ -2,5 +2,6 @@ package rbac
type IRbac interface { type IRbac interface {
Can(role, method, path string) bool Can(role, method, path string) bool
JsonPermissionsForUser(string) (string, error)
Reload() error Reload() error
} }