mycasbin.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package mycasbin
  2. import (
  3. gormAdapter "IotAdmin/core/gorm-adapter"
  4. "IotAdmin/core/logger"
  5. redisWatcher "IotAdmin/core/redis-watcher"
  6. "IotAdmin/core/sdk"
  7. "IotAdmin/core/sdk/config"
  8. "sync"
  9. "github.com/casbin/casbin/v2"
  10. "github.com/casbin/casbin/v2/log"
  11. "github.com/casbin/casbin/v2/model"
  12. "github.com/redis/go-redis/v9"
  13. "gorm.io/gorm"
  14. )
  15. var text = `
  16. [request_definition]
  17. r = sub, obj, act
  18. [policy_definition]
  19. p = sub, obj, act
  20. [policy_effect]
  21. e = some(where (p.eft == allow))
  22. [matchers]
  23. m = r.sub == p.sub && (keyMatch2(r.obj, p.obj) || keyMatch(r.obj, p.obj)) && (r.act == p.act || p.act == "*")
  24. `
  25. var (
  26. enforcer *casbin.SyncedEnforcer
  27. once sync.Once
  28. )
  29. func Setup(db *gorm.DB, _ string) *casbin.SyncedEnforcer {
  30. once.Do(func() {
  31. adapter, err := gormAdapter.NewAdapterByDBUseTableName(db, "sys", "casbin_rule")
  32. if err != nil && err.Error() != "invalid DDL" {
  33. panic(err)
  34. }
  35. m, err := model.NewModelFromString(text)
  36. if err != nil {
  37. panic(err)
  38. }
  39. enforcer, err = casbin.NewSyncedEnforcer(m, adapter)
  40. if err != nil {
  41. panic(err)
  42. }
  43. err = enforcer.LoadPolicy()
  44. if err != nil {
  45. panic(err)
  46. }
  47. // set redis watcher if redis config is not nil
  48. if config.CacheConfig.Redis != nil {
  49. w, err := redisWatcher.NewWatcher(config.CacheConfig.Redis.Addr, redisWatcher.WatcherOptions{
  50. Options: redis.Options{
  51. Network: "tcp",
  52. Password: config.CacheConfig.Redis.Password,
  53. },
  54. Channel: "/casbin",
  55. IgnoreSelf: false,
  56. })
  57. if err != nil {
  58. panic(err)
  59. }
  60. err = w.SetUpdateCallback(updateCallback)
  61. if err != nil {
  62. panic(err)
  63. }
  64. err = enforcer.SetWatcher(w)
  65. if err != nil {
  66. panic(err)
  67. }
  68. }
  69. log.SetLogger(&CasbinLogger{})
  70. enforcer.EnableLog(true)
  71. })
  72. return enforcer
  73. }
  74. func updateCallback(msg string) {
  75. l := logger.NewHelper(sdk.Runtime.GetLogger())
  76. l.Infof("casbin updateCallback msg: %v", msg)
  77. err := enforcer.LoadPolicy()
  78. if err != nil {
  79. l.Errorf("casbin LoadPolicy err: %v", err)
  80. }
  81. }