59 lines
1.3 KiB
Go
Executable File
59 lines
1.3 KiB
Go
Executable File
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/casbin/casbin/v2"
|
|
gormadapter "github.com/casbin/gorm-adapter/v3"
|
|
"github.com/gofiber/fiber/v2"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type AuthConfig struct {
|
|
*gormadapter.Adapter
|
|
Type string `yaml:"type" env:"AUTH_TYPE" env-default:"simple"`
|
|
Casbin *Casbin
|
|
Enforcer *casbin.Enforcer
|
|
}
|
|
|
|
func (d *AuthConfig) Setup(db *gorm.DB, file string) {
|
|
adapter, err := gormadapter.NewAdapterByDB(db)
|
|
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to initialize casbin adapter: %v", err))
|
|
}
|
|
d.Adapter = adapter
|
|
enforcer, err := casbin.NewEnforcer(file)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
enforcer.SetAdapter(adapter)
|
|
err = enforcer.LoadPolicy()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
d.Enforcer = enforcer
|
|
authConf := CasbinAuthConfig{
|
|
Enforcer: d.Enforcer,
|
|
PolicyAdapter: d.Adapter,
|
|
Lookup: func(ctx *fiber.Ctx) string {
|
|
userId := ctx.Locals("user_id")
|
|
if userId != nil {
|
|
return userId.(string)
|
|
}
|
|
|
|
return ""
|
|
},
|
|
Unauthorized: func(c *fiber.Ctx) error {
|
|
var err fiber.Error
|
|
err.Code = fiber.StatusUnauthorized
|
|
return CustomErrorHandler(c, &err)
|
|
},
|
|
Forbidden: func(c *fiber.Ctx) error {
|
|
var err fiber.Error
|
|
err.Code = fiber.StatusForbidden
|
|
return CustomErrorHandler(c, &err)
|
|
},
|
|
}
|
|
d.Casbin = CasbinAuth(authConf)
|
|
}
|