Skip to content

Commit 41953cc

Browse files
authored
feat: support multiple filters for LoadFilteredPolicy (#178)
1 parent b3d5928 commit 41953cc

File tree

2 files changed

+42
-10
lines changed

2 files changed

+42
-10
lines changed

adapter.go

+29-10
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ type Filter struct {
6969
V7 []string
7070
}
7171

72+
type BatchFilter struct {
73+
filters []Filter
74+
}
75+
7276
// Adapter represents the Gorm adapter for policy storage.
7377
type Adapter struct {
7478
driverName string
@@ -456,17 +460,32 @@ func (a *Adapter) LoadPolicy(model model.Model) error {
456460
func (a *Adapter) LoadFilteredPolicy(model model.Model, filter interface{}) error {
457461
var lines []CasbinRule
458462

459-
filterValue, ok := filter.(Filter)
460-
if !ok {
461-
return errors.New("invalid filter type")
462-
}
463-
464-
if err := a.db.Scopes(a.filterQuery(a.db, filterValue)).Order("ID").Find(&lines).Error; err != nil {
465-
return err
466-
}
463+
batchFilter := BatchFilter{
464+
filters: []Filter{},
465+
}
466+
switch filterValue := filter.(type) {
467+
case Filter:
468+
batchFilter.filters = []Filter{filterValue}
469+
case *Filter:
470+
batchFilter.filters = []Filter{*filterValue}
471+
case []Filter:
472+
batchFilter.filters = filterValue
473+
case BatchFilter:
474+
batchFilter = filterValue
475+
case *BatchFilter:
476+
batchFilter = *filterValue
477+
default:
478+
return errors.New("unsupported filter type")
479+
}
480+
481+
for _, f := range batchFilter.filters {
482+
if err := a.db.Scopes(a.filterQuery(a.db, f)).Order("ID").Find(&lines).Error; err != nil {
483+
return err
484+
}
467485

468-
for _, line := range lines {
469-
loadPolicyLine(line, model)
486+
for _, line := range lines {
487+
loadPolicyLine(line, model)
488+
}
470489
}
471490
a.isFiltered = true
472491

adapter_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,19 @@ func testFilteredPolicy(t *testing.T, a *Adapter) {
334334
// Load policies for alice and bob
335335
assert.Nil(t, e.LoadFilteredPolicy(Filter{V0: []string{"alice", "bob"}}))
336336
testGetPolicy(t, e, [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}})
337+
338+
assert.Nil(t, e.LoadFilteredPolicy(BatchFilter{
339+
filters: []Filter{
340+
{V0: []string{"alice"}},
341+
{V1: []string{"data2"}},
342+
},
343+
}))
344+
testGetPolicy(t, e, [][]string{
345+
{"alice", "data1", "read"},
346+
{"bob", "data2", "write"},
347+
{"data2_admin", "data2", "read"},
348+
{"data2_admin", "data2", "write"},
349+
})
337350
}
338351

339352
func testUpdatePolicy(t *testing.T, a *Adapter) {

0 commit comments

Comments
 (0)