package casbinauthz import ( "errors" "github.com/casbin/casbin/model" "github.com/casbin/casbin/persist" "github.com/jinzhu/gorm" "github.com/revel/modules/orm/gorm/app" ) type Line struct { PType string `gorm:"size:100"` V0 string `gorm:"size:100"` V1 string `gorm:"size:100"` V2 string `gorm:"size:100"` V3 string `gorm:"size:100"` V4 string `gorm:"size:100"` V5 string `gorm:"size:100"` } // Adapter represents the Gorm adapter for policy storage. type Adapter struct { driverName string dataSourceName string db *gorm.DB } // NewAdapter is the constructor for Adapter. func NewAdapter(params gormdb.DbInfo) *Adapter { a := &Adapter{} gormdb.InitDBWithParameters(params) a.db = gormdb.DB return a } func (a *Adapter) createTable() { if a.db.HasTable(&Line{}) { return } err := a.db.CreateTable(&Line{}).Error if err != nil { panic(err) } } func (a *Adapter) dropTable() { err := a.db.DropTable(&Line{}).Error if err != nil { panic(err) } } func loadPolicyLine(line Line, 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) } // LoadPolicy loads policy from database. func (a *Adapter) LoadPolicy(model model.Model) error { var lines []Line err := a.db.Find(&lines).Error if err != nil { return err } for _, line := range lines { loadPolicyLine(line, model) } return nil } func savePolicyLine(ptype string, rule []string) Line { line := Line{} 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 } // SavePolicy saves policy to database. func (a *Adapter) SavePolicy(model model.Model) error { a.dropTable() a.createTable() for ptype, ast := range model["p"] { for _, rule := range ast.Policy { line := savePolicyLine(ptype, rule) err := a.db.Create(&line).Error if err != nil { return err } } } for ptype, ast := range model["g"] { for _, rule := range ast.Policy { line := savePolicyLine(ptype, rule) err := a.db.Create(&line).Error if err != nil { return err } } } return nil } // AddPolicy adds a policy rule to the storage. func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error { return errors.New("not implemented") } // RemovePolicy removes a policy rule from the storage. func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error { return errors.New("not implemented") } // RemoveFilteredPolicy removes policy rules that match the filter from the storage. func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error { return errors.New("not implemented") }