Commit 7223ed5c authored by khoipham's avatar khoipham

SavePolicy now drop all previous data

parent 19ee6270
...@@ -190,6 +190,11 @@ func savePolicyLine(ptype string, rule []string) *CasbinRule { ...@@ -190,6 +190,11 @@ func savePolicyLine(ptype string, rule []string) *CasbinRule {
// SavePolicy saves policy to database. // SavePolicy saves policy to database.
func (a *Adapter) SavePolicy(model model.Model) error { func (a *Adapter) SavePolicy(model model.Model) error {
_, err := a.db.Model((*CasbinRule)(nil)).Where("id IS NOT NULL").Delete()
if err != nil {
return err
}
var lines []*CasbinRule var lines []*CasbinRule
for ptype, ast := range model["p"] { for ptype, ast := range model["p"] {
...@@ -206,7 +211,7 @@ func (a *Adapter) SavePolicy(model model.Model) error { ...@@ -206,7 +211,7 @@ func (a *Adapter) SavePolicy(model model.Model) error {
} }
} }
_, err := a.db.Model(&lines). _, err = a.db.Model(&lines).
OnConflict("DO NOTHING"). OnConflict("DO NOTHING").
Insert() Insert()
return err return err
......
...@@ -56,7 +56,10 @@ func (s *AdapterTestSuite) TearDownTest() { ...@@ -56,7 +56,10 @@ func (s *AdapterTestSuite) TearDownTest() {
func (s *AdapterTestSuite) TestSaveLoad() { func (s *AdapterTestSuite) TestSaveLoad() {
s.Assert().False(s.e.IsFiltered()) s.Assert().False(s.e.IsFiltered())
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}},
s.e.GetPolicy(),
)
} }
func (s *AdapterTestSuite) TestAutoSave() { func (s *AdapterTestSuite) TestAutoSave() {
...@@ -72,7 +75,10 @@ func (s *AdapterTestSuite) TestAutoSave() { ...@@ -72,7 +75,10 @@ func (s *AdapterTestSuite) TestAutoSave() {
err = s.e.LoadPolicy() err = s.e.LoadPolicy()
s.Require().NoError(err) s.Require().NoError(err)
// This is still the original policy. // This is still the original policy.
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}},
s.e.GetPolicy(),
)
// Now we enable the AutoSave. // Now we enable the AutoSave.
s.e.EnableAutoSave(true) s.e.EnableAutoSave(true)
...@@ -85,14 +91,20 @@ func (s *AdapterTestSuite) TestAutoSave() { ...@@ -85,14 +91,20 @@ func (s *AdapterTestSuite) TestAutoSave() {
err = s.e.LoadPolicy() err = s.e.LoadPolicy()
s.Require().NoError(err) s.Require().NoError(err)
// The policy has a new rule: {"alice", "data1", "write"}. // The policy has a new rule: {"alice", "data1", "write"}.
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}},
s.e.GetPolicy(),
)
// Aditional AddPolicy have no effect // Aditional AddPolicy have no effect
_, err = s.e.AddPolicy("alice", "data1", "write") _, err = s.e.AddPolicy("alice", "data1", "write")
s.Require().NoError(err) s.Require().NoError(err)
err = s.e.LoadPolicy() err = s.e.LoadPolicy()
s.Require().NoError(err) s.Require().NoError(err)
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}},
s.e.GetPolicy(),
)
s.Require().NoError(err) s.Require().NoError(err)
} }
...@@ -107,31 +119,46 @@ func (s *AdapterTestSuite) TestConstructorOptions() { ...@@ -107,31 +119,46 @@ func (s *AdapterTestSuite) TestConstructorOptions() {
s.e, err = casbin.NewEnforcer("examples/rbac_model.conf", a) s.e, err = casbin.NewEnforcer("examples/rbac_model.conf", a)
s.Require().NoError(err) s.Require().NoError(err)
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}},
s.e.GetPolicy(),
)
} }
func (s *AdapterTestSuite) TestRemovePolicy() { func (s *AdapterTestSuite) TestRemovePolicy() {
_, err := s.e.RemovePolicy("alice", "data1", "read") _, err := s.e.RemovePolicy("alice", "data1", "read")
s.Require().NoError(err) s.Require().NoError(err)
s.assertPolicy([][]string{{"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}},
s.e.GetPolicy(),
)
err = s.e.LoadPolicy() err = s.e.LoadPolicy()
s.Require().NoError(err) s.Require().NoError(err)
s.assertPolicy([][]string{{"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}},
s.e.GetPolicy(),
)
} }
func (s *AdapterTestSuite) TestRemoveFilteredPolicy() { func (s *AdapterTestSuite) TestRemoveFilteredPolicy() {
_, err := s.e.RemoveFilteredPolicy(0, "", "data2") _, err := s.e.RemoveFilteredPolicy(0, "", "data2")
s.Require().NoError(err) s.Require().NoError(err)
s.assertPolicy([][]string{{"alice", "data1", "read"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}},
s.e.GetPolicy(),
)
err = s.e.LoadPolicy() err = s.e.LoadPolicy()
s.Require().NoError(err) s.Require().NoError(err)
s.assertPolicy([][]string{{"alice", "data1", "read"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}},
s.e.GetPolicy(),
)
} }
func (s *AdapterTestSuite) TestLoadFilteredPolicy() { func (s *AdapterTestSuite) TestLoadFilteredPolicy() {
...@@ -143,7 +170,10 @@ func (s *AdapterTestSuite) TestLoadFilteredPolicy() { ...@@ -143,7 +170,10 @@ func (s *AdapterTestSuite) TestLoadFilteredPolicy() {
}) })
s.Require().NoError(err) s.Require().NoError(err)
s.Assert().True(e.IsFiltered()) s.Assert().True(e.IsFiltered())
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"data2_admin", "data2", "read"}}, e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"data2_admin", "data2", "read"}},
e.GetPolicy(),
)
} }
func (s *AdapterTestSuite) TestLoadFilteredGroupingPolicy() { func (s *AdapterTestSuite) TestLoadFilteredGroupingPolicy() {
...@@ -176,7 +206,35 @@ func (s *AdapterTestSuite) TestLoadFilteredPolicyNilFilter() { ...@@ -176,7 +206,35 @@ func (s *AdapterTestSuite) TestLoadFilteredPolicyNilFilter() {
s.Require().NoError(err) s.Require().NoError(err)
s.Assert().False(e.IsFiltered()) s.Assert().False(e.IsFiltered())
s.assertPolicy([][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, s.e.GetPolicy()) s.assertPolicy(
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}},
s.e.GetPolicy(),
)
}
func (s *AdapterTestSuite) TestSavePolicyClearPreviousData() {
s.e.EnableAutoSave(false)
policies := s.e.GetPolicy()
// clone slice to avoid shufling elements
policies = append(policies[:0:0], policies...)
for _, p := range policies {
_, err := s.e.RemovePolicy(p)
s.Require().NoError(err)
}
s.assertPolicy(
[][]string{},
s.e.GetPolicy(),
)
err := s.e.SavePolicy()
s.Require().NoError(err)
err = s.e.LoadPolicy()
s.Require().NoError(err)
s.assertPolicy(
[][]string{},
s.e.GetPolicy(),
)
} }
func TestAdapterTestSuite(t *testing.T) { func TestAdapterTestSuite(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment