690 lines
24 KiB
Go
690 lines
24 KiB
Go
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
package casbin
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/casbin/govaluate"
|
|
|
|
"github.com/casbin/casbin/v3/persist"
|
|
"github.com/casbin/casbin/v3/rbac"
|
|
)
|
|
|
|
// SyncedEnforcer wraps Enforcer and provides synchronized access.
|
|
type SyncedEnforcer struct {
|
|
*Enforcer
|
|
m sync.RWMutex
|
|
stopAutoLoad chan struct{}
|
|
autoLoadRunning int32
|
|
}
|
|
|
|
// NewSyncedEnforcer creates a synchronized enforcer via file or DB.
|
|
func NewSyncedEnforcer(params ...interface{}) (*SyncedEnforcer, error) {
|
|
e := &SyncedEnforcer{}
|
|
var err error
|
|
e.Enforcer, err = NewEnforcer(params...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
e.stopAutoLoad = make(chan struct{}, 1)
|
|
e.autoLoadRunning = 0
|
|
return e, nil
|
|
}
|
|
|
|
// GetLock return the private RWMutex lock.
|
|
func (e *SyncedEnforcer) GetLock() *sync.RWMutex {
|
|
return &e.m
|
|
}
|
|
|
|
// GetRoleManager gets the current role manager with synchronization.
|
|
func (e *SyncedEnforcer) GetRoleManager() rbac.RoleManager {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetRoleManager()
|
|
}
|
|
|
|
// GetNamedRoleManager gets the role manager for the named policy with synchronization.
|
|
func (e *SyncedEnforcer) GetNamedRoleManager(ptype string) rbac.RoleManager {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetNamedRoleManager(ptype)
|
|
}
|
|
|
|
// SetRoleManager sets the current role manager with synchronization.
|
|
func (e *SyncedEnforcer) SetRoleManager(rm rbac.RoleManager) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
e.Enforcer.SetRoleManager(rm)
|
|
}
|
|
|
|
// SetNamedRoleManager sets the role manager for the named policy with synchronization.
|
|
func (e *SyncedEnforcer) SetNamedRoleManager(ptype string, rm rbac.RoleManager) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
e.Enforcer.SetNamedRoleManager(ptype, rm)
|
|
}
|
|
|
|
// IsAutoLoadingRunning check if SyncedEnforcer is auto loading policies.
|
|
func (e *SyncedEnforcer) IsAutoLoadingRunning() bool {
|
|
return atomic.LoadInt32(&(e.autoLoadRunning)) != 0
|
|
}
|
|
|
|
// StartAutoLoadPolicy starts a go routine that will every specified duration call LoadPolicy.
|
|
func (e *SyncedEnforcer) StartAutoLoadPolicy(d time.Duration) {
|
|
// Don't start another goroutine if there is already one running
|
|
if !atomic.CompareAndSwapInt32(&e.autoLoadRunning, 0, 1) {
|
|
return
|
|
}
|
|
|
|
ticker := time.NewTicker(d)
|
|
go func() {
|
|
defer func() {
|
|
ticker.Stop()
|
|
atomic.StoreInt32(&(e.autoLoadRunning), int32(0))
|
|
}()
|
|
n := 1
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
// error intentionally ignored
|
|
_ = e.LoadPolicy()
|
|
// Uncomment this line to see when the policy is loaded.
|
|
// log.Print("Load policy for time: ", n)
|
|
n++
|
|
case <-e.stopAutoLoad:
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
// StopAutoLoadPolicy causes the go routine to exit.
|
|
func (e *SyncedEnforcer) StopAutoLoadPolicy() {
|
|
if e.IsAutoLoadingRunning() {
|
|
e.stopAutoLoad <- struct{}{}
|
|
}
|
|
}
|
|
|
|
// SetWatcher sets the current watcher.
|
|
func (e *SyncedEnforcer) SetWatcher(watcher persist.Watcher) error {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SetWatcher(watcher)
|
|
}
|
|
|
|
// LoadModel reloads the model from the model CONF file.
|
|
func (e *SyncedEnforcer) LoadModel() error {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.LoadModel()
|
|
}
|
|
|
|
// ClearPolicy clears all policy.
|
|
func (e *SyncedEnforcer) ClearPolicy() {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
e.Enforcer.ClearPolicy()
|
|
}
|
|
|
|
// LoadPolicy reloads the policy from file/database.
|
|
func (e *SyncedEnforcer) LoadPolicy() error {
|
|
e.m.RLock()
|
|
newModel, err := e.loadPolicyFromAdapter(e.model)
|
|
e.m.RUnlock()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
e.m.Lock()
|
|
err = e.applyModifiedModel(newModel)
|
|
e.m.Unlock()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// LoadFilteredPolicy reloads a filtered policy from file/database.
|
|
func (e *SyncedEnforcer) LoadFilteredPolicy(filter interface{}) error {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.LoadFilteredPolicy(filter)
|
|
}
|
|
|
|
// LoadIncrementalFilteredPolicy reloads a filtered policy from file/database.
|
|
func (e *SyncedEnforcer) LoadIncrementalFilteredPolicy(filter interface{}) error {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.LoadIncrementalFilteredPolicy(filter)
|
|
}
|
|
|
|
// SavePolicy saves the current policy (usually after changed with Casbin API) back to file/database.
|
|
func (e *SyncedEnforcer) SavePolicy() error {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SavePolicy()
|
|
}
|
|
|
|
// BuildRoleLinks manually rebuild the role inheritance relations.
|
|
func (e *SyncedEnforcer) BuildRoleLinks() error {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.BuildRoleLinks()
|
|
}
|
|
|
|
// Enforce decides whether a "subject" can access a "object" with the operation "action", input parameters are usually: (sub, obj, act).
|
|
func (e *SyncedEnforcer) Enforce(rvals ...interface{}) (bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.Enforce(rvals...)
|
|
}
|
|
|
|
// EnforceWithMatcher use a custom matcher to decides whether a "subject" can access a "object" with the operation "action", input parameters are usually: (matcher, sub, obj, act), use model matcher by default when matcher is "".
|
|
func (e *SyncedEnforcer) EnforceWithMatcher(matcher string, rvals ...interface{}) (bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.EnforceWithMatcher(matcher, rvals...)
|
|
}
|
|
|
|
// EnforceEx explain enforcement by informing matched rules.
|
|
func (e *SyncedEnforcer) EnforceEx(rvals ...interface{}) (bool, []string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.EnforceEx(rvals...)
|
|
}
|
|
|
|
// EnforceExWithMatcher use a custom matcher and explain enforcement by informing matched rules.
|
|
func (e *SyncedEnforcer) EnforceExWithMatcher(matcher string, rvals ...interface{}) (bool, []string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.EnforceExWithMatcher(matcher, rvals...)
|
|
}
|
|
|
|
// BatchEnforce enforce in batches.
|
|
func (e *SyncedEnforcer) BatchEnforce(requests [][]interface{}) ([]bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.BatchEnforce(requests)
|
|
}
|
|
|
|
// BatchEnforceWithMatcher enforce with matcher in batches.
|
|
func (e *SyncedEnforcer) BatchEnforceWithMatcher(matcher string, requests [][]interface{}) ([]bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.BatchEnforceWithMatcher(matcher, requests)
|
|
}
|
|
|
|
// GetAllSubjects gets the list of subjects that show up in the current policy.
|
|
func (e *SyncedEnforcer) GetAllSubjects() ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllSubjects()
|
|
}
|
|
|
|
// GetAllNamedSubjects gets the list of subjects that show up in the current named policy.
|
|
func (e *SyncedEnforcer) GetAllNamedSubjects(ptype string) ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllNamedSubjects(ptype)
|
|
}
|
|
|
|
// GetAllObjects gets the list of objects that show up in the current policy.
|
|
func (e *SyncedEnforcer) GetAllObjects() ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllObjects()
|
|
}
|
|
|
|
// GetAllNamedObjects gets the list of objects that show up in the current named policy.
|
|
func (e *SyncedEnforcer) GetAllNamedObjects(ptype string) ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllNamedObjects(ptype)
|
|
}
|
|
|
|
// GetAllActions gets the list of actions that show up in the current policy.
|
|
func (e *SyncedEnforcer) GetAllActions() ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllActions()
|
|
}
|
|
|
|
// GetAllNamedActions gets the list of actions that show up in the current named policy.
|
|
func (e *SyncedEnforcer) GetAllNamedActions(ptype string) ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllNamedActions(ptype)
|
|
}
|
|
|
|
// GetAllRoles gets the list of roles that show up in the current policy.
|
|
func (e *SyncedEnforcer) GetAllRoles() ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllRoles()
|
|
}
|
|
|
|
// GetAllNamedRoles gets the list of roles that show up in the current named policy.
|
|
func (e *SyncedEnforcer) GetAllNamedRoles(ptype string) ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllNamedRoles(ptype)
|
|
}
|
|
|
|
// GetAllUsers gets the list of users that show up in the current policy.
|
|
func (e *SyncedEnforcer) GetAllUsers() ([]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetAllUsers()
|
|
}
|
|
|
|
// GetPolicy gets all the authorization rules in the policy.
|
|
func (e *SyncedEnforcer) GetPolicy() ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetPolicy()
|
|
}
|
|
|
|
// GetFilteredPolicy gets all the authorization rules in the policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) GetFilteredPolicy(fieldIndex int, fieldValues ...string) ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetFilteredPolicy(fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// GetNamedPolicy gets all the authorization rules in the named policy.
|
|
func (e *SyncedEnforcer) GetNamedPolicy(ptype string) ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetNamedPolicy(ptype)
|
|
}
|
|
|
|
// GetFilteredNamedPolicy gets all the authorization rules in the named policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) GetFilteredNamedPolicy(ptype string, fieldIndex int, fieldValues ...string) ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetFilteredNamedPolicy(ptype, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// GetGroupingPolicy gets all the role inheritance rules in the policy.
|
|
func (e *SyncedEnforcer) GetGroupingPolicy() ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetGroupingPolicy()
|
|
}
|
|
|
|
// GetFilteredGroupingPolicy gets all the role inheritance rules in the policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) GetFilteredGroupingPolicy(fieldIndex int, fieldValues ...string) ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetFilteredGroupingPolicy(fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// GetNamedGroupingPolicy gets all the role inheritance rules in the policy.
|
|
func (e *SyncedEnforcer) GetNamedGroupingPolicy(ptype string) ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetNamedGroupingPolicy(ptype)
|
|
}
|
|
|
|
// GetFilteredNamedGroupingPolicy gets all the role inheritance rules in the policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) GetFilteredNamedGroupingPolicy(ptype string, fieldIndex int, fieldValues ...string) ([][]string, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.GetFilteredNamedGroupingPolicy(ptype, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// HasPolicy determines whether an authorization rule exists.
|
|
func (e *SyncedEnforcer) HasPolicy(params ...interface{}) (bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.HasPolicy(params...)
|
|
}
|
|
|
|
// HasNamedPolicy determines whether a named authorization rule exists.
|
|
func (e *SyncedEnforcer) HasNamedPolicy(ptype string, params ...interface{}) (bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.HasNamedPolicy(ptype, params...)
|
|
}
|
|
|
|
// AddPolicy adds an authorization rule to the current policy.
|
|
// If the rule already exists, the function returns false and the rule will not be added.
|
|
// Otherwise the function returns true by adding the new rule.
|
|
func (e *SyncedEnforcer) AddPolicy(params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddPolicy(params...)
|
|
}
|
|
|
|
// AddPolicies adds authorization rules to the current policy.
|
|
// If the rule already exists, the function returns false for the corresponding rule and the rule will not be added.
|
|
// Otherwise the function returns true for the corresponding rule by adding the new rule.
|
|
func (e *SyncedEnforcer) AddPolicies(rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddPolicies(rules)
|
|
}
|
|
|
|
// AddPoliciesEx adds authorization rules to the current policy.
|
|
// If the rule already exists, the rule will not be added.
|
|
// But unlike AddPolicies, other non-existent rules are added instead of returning false directly.
|
|
func (e *SyncedEnforcer) AddPoliciesEx(rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddPoliciesEx(rules)
|
|
}
|
|
|
|
// AddNamedPolicy adds an authorization rule to the current named policy.
|
|
// If the rule already exists, the function returns false and the rule will not be added.
|
|
// Otherwise the function returns true by adding the new rule.
|
|
func (e *SyncedEnforcer) AddNamedPolicy(ptype string, params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddNamedPolicy(ptype, params...)
|
|
}
|
|
|
|
// AddNamedPolicies adds authorization rules to the current named policy.
|
|
// If the rule already exists, the function returns false for the corresponding rule and the rule will not be added.
|
|
// Otherwise the function returns true for the corresponding by adding the new rule.
|
|
func (e *SyncedEnforcer) AddNamedPolicies(ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddNamedPolicies(ptype, rules)
|
|
}
|
|
|
|
// AddNamedPoliciesEx adds authorization rules to the current named policy.
|
|
// If the rule already exists, the rule will not be added.
|
|
// But unlike AddNamedPolicies, other non-existent rules are added instead of returning false directly.
|
|
func (e *SyncedEnforcer) AddNamedPoliciesEx(ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddNamedPoliciesEx(ptype, rules)
|
|
}
|
|
|
|
// RemovePolicy removes an authorization rule from the current policy.
|
|
func (e *SyncedEnforcer) RemovePolicy(params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemovePolicy(params...)
|
|
}
|
|
|
|
// UpdatePolicy updates an authorization rule from the current policy.
|
|
func (e *SyncedEnforcer) UpdatePolicy(oldPolicy []string, newPolicy []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdatePolicy(oldPolicy, newPolicy)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateNamedPolicy(ptype string, p1 []string, p2 []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateNamedPolicy(ptype, p1, p2)
|
|
}
|
|
|
|
// UpdatePolicies updates authorization rules from the current policies.
|
|
func (e *SyncedEnforcer) UpdatePolicies(oldPolices [][]string, newPolicies [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdatePolicies(oldPolices, newPolicies)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateNamedPolicies(ptype string, p1 [][]string, p2 [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateNamedPolicies(ptype, p1, p2)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateFilteredPolicies(newPolicies [][]string, fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateFilteredPolicies(newPolicies, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateFilteredNamedPolicies(ptype string, newPolicies [][]string, fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateFilteredNamedPolicies(ptype, newPolicies, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// RemovePolicies removes authorization rules from the current policy.
|
|
func (e *SyncedEnforcer) RemovePolicies(rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemovePolicies(rules)
|
|
}
|
|
|
|
// RemoveFilteredPolicy removes an authorization rule from the current policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) RemoveFilteredPolicy(fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveFilteredPolicy(fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// RemoveNamedPolicy removes an authorization rule from the current named policy.
|
|
func (e *SyncedEnforcer) RemoveNamedPolicy(ptype string, params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveNamedPolicy(ptype, params...)
|
|
}
|
|
|
|
// RemoveNamedPolicies removes authorization rules from the current named policy.
|
|
func (e *SyncedEnforcer) RemoveNamedPolicies(ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveNamedPolicies(ptype, rules)
|
|
}
|
|
|
|
// RemoveFilteredNamedPolicy removes an authorization rule from the current named policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) RemoveFilteredNamedPolicy(ptype string, fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveFilteredNamedPolicy(ptype, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// HasGroupingPolicy determines whether a role inheritance rule exists.
|
|
func (e *SyncedEnforcer) HasGroupingPolicy(params ...interface{}) (bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.HasGroupingPolicy(params...)
|
|
}
|
|
|
|
// HasNamedGroupingPolicy determines whether a named role inheritance rule exists.
|
|
func (e *SyncedEnforcer) HasNamedGroupingPolicy(ptype string, params ...interface{}) (bool, error) {
|
|
e.m.RLock()
|
|
defer e.m.RUnlock()
|
|
return e.Enforcer.HasNamedGroupingPolicy(ptype, params...)
|
|
}
|
|
|
|
// AddGroupingPolicy adds a role inheritance rule to the current policy.
|
|
// If the rule already exists, the function returns false and the rule will not be added.
|
|
// Otherwise the function returns true by adding the new rule.
|
|
func (e *SyncedEnforcer) AddGroupingPolicy(params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddGroupingPolicy(params...)
|
|
}
|
|
|
|
// AddGroupingPolicies adds role inheritance rulea to the current policy.
|
|
// If the rule already exists, the function returns false for the corresponding policy rule and the rule will not be added.
|
|
// Otherwise the function returns true for the corresponding policy rule by adding the new rule.
|
|
func (e *SyncedEnforcer) AddGroupingPolicies(rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddGroupingPolicies(rules)
|
|
}
|
|
|
|
// AddGroupingPoliciesEx adds role inheritance rules to the current policy.
|
|
// If the rule already exists, the rule will not be added.
|
|
// But unlike AddGroupingPolicies, other non-existent rules are added instead of returning false directly.
|
|
func (e *SyncedEnforcer) AddGroupingPoliciesEx(rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddGroupingPoliciesEx(rules)
|
|
}
|
|
|
|
// AddNamedGroupingPolicy adds a named role inheritance rule to the current policy.
|
|
// If the rule already exists, the function returns false and the rule will not be added.
|
|
// Otherwise the function returns true by adding the new rule.
|
|
func (e *SyncedEnforcer) AddNamedGroupingPolicy(ptype string, params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddNamedGroupingPolicy(ptype, params...)
|
|
}
|
|
|
|
// AddNamedGroupingPolicies adds named role inheritance rules to the current policy.
|
|
// If the rule already exists, the function returns false for the corresponding policy rule and the rule will not be added.
|
|
// Otherwise the function returns true for the corresponding policy rule by adding the new rule.
|
|
func (e *SyncedEnforcer) AddNamedGroupingPolicies(ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddNamedGroupingPolicies(ptype, rules)
|
|
}
|
|
|
|
// AddNamedGroupingPoliciesEx adds named role inheritance rules to the current policy.
|
|
// If the rule already exists, the rule will not be added.
|
|
// But unlike AddNamedGroupingPolicies, other non-existent rules are added instead of returning false directly.
|
|
func (e *SyncedEnforcer) AddNamedGroupingPoliciesEx(ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.AddNamedGroupingPoliciesEx(ptype, rules)
|
|
}
|
|
|
|
// RemoveGroupingPolicy removes a role inheritance rule from the current policy.
|
|
func (e *SyncedEnforcer) RemoveGroupingPolicy(params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveGroupingPolicy(params...)
|
|
}
|
|
|
|
// RemoveGroupingPolicies removes role inheritance rules from the current policy.
|
|
func (e *SyncedEnforcer) RemoveGroupingPolicies(rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveGroupingPolicies(rules)
|
|
}
|
|
|
|
// RemoveFilteredGroupingPolicy removes a role inheritance rule from the current policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) RemoveFilteredGroupingPolicy(fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveFilteredGroupingPolicy(fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// RemoveNamedGroupingPolicy removes a role inheritance rule from the current named policy.
|
|
func (e *SyncedEnforcer) RemoveNamedGroupingPolicy(ptype string, params ...interface{}) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveNamedGroupingPolicy(ptype, params...)
|
|
}
|
|
|
|
// RemoveNamedGroupingPolicies removes role inheritance rules from the current named policy.
|
|
func (e *SyncedEnforcer) RemoveNamedGroupingPolicies(ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveNamedGroupingPolicies(ptype, rules)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateGroupingPolicy(oldRule []string, newRule []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateGroupingPolicy(oldRule, newRule)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateGroupingPolicies(oldRules [][]string, newRules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateGroupingPolicies(oldRules, newRules)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateNamedGroupingPolicy(ptype string, oldRule []string, newRule []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateNamedGroupingPolicy(ptype, oldRule, newRule)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) UpdateNamedGroupingPolicies(ptype string, oldRules [][]string, newRules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.UpdateNamedGroupingPolicies(ptype, oldRules, newRules)
|
|
}
|
|
|
|
// RemoveFilteredNamedGroupingPolicy removes a role inheritance rule from the current named policy, field filters can be specified.
|
|
func (e *SyncedEnforcer) RemoveFilteredNamedGroupingPolicy(ptype string, fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.RemoveFilteredNamedGroupingPolicy(ptype, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
// AddFunction adds a customized function.
|
|
func (e *SyncedEnforcer) AddFunction(name string, function govaluate.ExpressionFunction) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
e.Enforcer.AddFunction(name, function)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfAddPolicy(sec string, ptype string, rule []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfAddPolicy(sec, ptype, rule)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfAddPolicies(sec string, ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfAddPolicies(sec, ptype, rules)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfAddPoliciesEx(sec string, ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfAddPoliciesEx(sec, ptype, rules)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfRemovePolicy(sec string, ptype string, rule []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfRemovePolicy(sec, ptype, rule)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfRemovePolicies(sec string, ptype string, rules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfRemovePolicies(sec, ptype, rules)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfRemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfRemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues...)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfUpdatePolicy(sec string, ptype string, oldRule, newRule []string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfUpdatePolicy(sec, ptype, oldRule, newRule)
|
|
}
|
|
|
|
func (e *SyncedEnforcer) SelfUpdatePolicies(sec string, ptype string, oldRules, newRules [][]string) (bool, error) {
|
|
e.m.Lock()
|
|
defer e.m.Unlock()
|
|
return e.Enforcer.SelfUpdatePolicies(sec, ptype, oldRules, newRules)
|
|
}
|