casbin / gorm-adapter

GORM adapter for Casbin, see extended version of GORM Adapter Ex at: https://github.com/casbin/gorm-adapter-ex
https://github.com/casbin/casbin
Apache License 2.0
678 stars 206 forks source link

policy get loaded twice #221

Closed pot-code closed 1 year ago

pot-code commented 1 year ago

constructor function:

func NewCasbinEnforcer(db *gorm.DB) *casbin.Enforcer {
    gormadapter.TurnOffAutoMigrate(db)
    a, err := gormadapter.NewAdapterByDBWithCustomTable(db, &model.CasbinRule{}, "casbin_rules")
    if err != nil {
        panic(fmt.Errorf("error creating casbin gorm adapter: %w", err))
    }

    e, err := casbin.NewEnforcer("casbin/model.conf", a)
    if err != nil {
        panic(fmt.Errorf("error creating casbin enforcer: %w", err))
    }
    e.SetRoleManager(newRoleManager(db))
    e.EnableAutoSave(true)
    e.LoadPolicy()
    return e
}

logs(zerolog adapted):

7:36PM TRC elapsed=2.047459 rows=1 sql="SELECT * FROM `casbin_rules` ORDER BY ID"
7:36PM TRC elapsed=0.93575 rows=1 sql="SELECT * FROM `casbin_rules` ORDER BY ID"

if I delete e.LoadPolicy(), the sql will only print once

casbin-bot commented 1 year ago

@tangyang9464 @JalinWang @imp2002

hsluoyz commented 1 year ago

@PokIsemaine

PokIsemaine commented 1 year ago

In casbin.NewEnforcer() contains an automatic LoadPolicy.

The order of calls is as follows, which you can see using the IDE's debugger

  1. func NewEnforcer(params ...interface{}) (*Enforcer, error)
  2. e.InitWithAdapter(p0, p1.(persist.Adapter))
  3. e.InitWithModelAndAdapter(m, adapter)
  4. e.LoadPolicy()
  5. e.adapter.LoadPolicy(newModel)
hsluoyz commented 1 year ago

@pot-code use enforcer, _ := casbin.NewEnforcer() to create an enforcer without implicit LoadPolicy() call, see example at: https://casbin.org/docs/policy-subset-loading