163 lines
3.1 KiB
Go
163 lines
3.1 KiB
Go
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")
|
|
}
|