package casbinauth import ( jxmodel "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" "github.com/casbin/casbin/model" "github.com/casbin/casbin/persist" ) type Adapter struct { } // finalizer is the destructor for Adapter. func finalizer(a *Adapter) { } func NewAdapter() *Adapter { return &Adapter{} } func loadPolicyLine(line jxmodel.CasbinRule, model model.Model) { lineText := line.PType if line.V0 != "" { lineText += ", " + line.V0 } if line.V1 != "" { lineText += ", " + line.V1 } if line.V2 != "" { lineText += ", " + line.V2 } if line.V3 != "" { lineText += ", " + line.V3 } if line.V4 != "" { lineText += ", " + line.V4 } if line.V5 != "" { lineText += ", " + line.V5 } persist.LoadPolicyLine(lineText, model) } func (a *Adapter) LoadPolicy(model model.Model) error { var lines []jxmodel.CasbinRule o := orm.NewOrm() _, err := o.QueryTable("casbin_rule").Limit(-1).All(&lines) if err != nil { return err } for _, line := range lines { loadPolicyLine(line, model) } return nil } func savePolicyLine(ptype string, rule []string) jxmodel.CasbinRule { line := jxmodel.CasbinRule{} line.PType = ptype if len(rule) > 0 { line.V0 = rule[0] } if len(rule) > 1 { line.V1 = rule[1] } if len(rule) > 2 { line.V2 = rule[2] } if len(rule) > 3 { line.V3 = rule[3] } if len(rule) > 4 { line.V4 = rule[4] } if len(rule) > 5 { line.V5 = rule[5] } return line } func (a *Adapter) clearAll(o orm.Ormer) (err error) { _, err = o.Raw(` DELETE t1 FROM casbin_rule t1 `).Exec() return err } // SavePolicy saves policy to database. func (a *Adapter) SavePolicy(model model.Model) error { globals.SugarLogger.Debugf("SavePolicy") o := orm.NewOrm() a.clearAll(o) var lines []jxmodel.CasbinRule for ptype, ast := range model["p"] { for _, rule := range ast.Policy { line := savePolicyLine(ptype, rule) lines = append(lines, line) } } for ptype, ast := range model["g"] { for _, rule := range ast.Policy { line := savePolicyLine(ptype, rule) lines = append(lines, line) } } _, err := o.InsertMulti(len(lines), lines) return err } // AddPolicy adds a policy rule to the storage. func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error { o := orm.NewOrm() line := savePolicyLine(ptype, rule) _, err := o.Insert(&line) return err } // RemovePolicy removes a policy rule from the storage. func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error { o := orm.NewOrm() line := savePolicyLine(ptype, rule) _, err := o.Delete(&line, "p_type", "v0", "v1", "v2", "v3", "v4", "v5") return err } // RemoveFilteredPolicy removes policy rules that match the filter from the storage. func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error { line := jxmodel.CasbinRule{} line.PType = ptype filter := []string{} filter = append(filter, "p_type") if fieldIndex <= 0 && 0 < fieldIndex+len(fieldValues) { line.V0 = fieldValues[0-fieldIndex] filter = append(filter, "v0") } if fieldIndex <= 1 && 1 < fieldIndex+len(fieldValues) { line.V1 = fieldValues[1-fieldIndex] filter = append(filter, "v1") } if fieldIndex <= 2 && 2 < fieldIndex+len(fieldValues) { line.V2 = fieldValues[2-fieldIndex] filter = append(filter, "v2") } if fieldIndex <= 3 && 3 < fieldIndex+len(fieldValues) { line.V3 = fieldValues[3-fieldIndex] filter = append(filter, "v3") } if fieldIndex <= 4 && 4 < fieldIndex+len(fieldValues) { line.V4 = fieldValues[4-fieldIndex] filter = append(filter, "v4") } if fieldIndex <= 5 && 5 < fieldIndex+len(fieldValues) { line.V5 = fieldValues[5-fieldIndex] filter = append(filter, "v5") } o := orm.NewOrm() _, err := o.Delete(&line, filter...) return err }