Optimize RBAC service loading

This commit is contained in:
Denis Arh
2020-09-16 07:37:06 +02:00
parent d0aefb83b6
commit 1c2f4de28c
5 changed files with 38 additions and 8 deletions
+12 -1
View File
@@ -17,6 +17,7 @@ import (
"github.com/cortezaproject/corteza-server/pkg/logger"
"github.com/cortezaproject/corteza-server/pkg/mail"
"github.com/cortezaproject/corteza-server/pkg/monitor"
"github.com/cortezaproject/corteza-server/pkg/permissions"
"github.com/cortezaproject/corteza-server/pkg/scheduler"
"github.com/cortezaproject/corteza-server/pkg/sentry"
"github.com/cortezaproject/corteza-server/provision/compose"
@@ -149,7 +150,6 @@ func (app *CortezaApp) InitServices(ctx context.Context) (err error) {
return nil
} else if err := app.InitStore(ctx); err != nil {
return err
}
ctx = actionlog.RequestOriginToContext(ctx, actionlog.RequestOrigin_APP_Init)
@@ -162,6 +162,17 @@ func (app *CortezaApp) InitServices(ctx context.Context) (err error) {
corredor.Service().SetUserFinder(sysService.DefaultUser)
corredor.Service().SetRoleFinder(sysService.DefaultRole)
{
// Initialize RBAC subsystem
// and (re)load rules from the storage backend
err = permissions.Initialize(app.Log, app.Store)
if err != nil {
return
}
permissions.Global().Reload(ctx)
}
// Initializes system services
//
// Note: this is a legacy approach, all services from all 3 apps
+1 -1
View File
@@ -113,7 +113,7 @@ func Initialize(ctx context.Context, log *zap.Logger, s store.Storer, c Config)
if DefaultPermissions == nil {
// Do not override permissions service stored under DefaultPermissions
// to allow integration tests to inject own permission service
DefaultPermissions = permissions.Service(ctx, DefaultLogger, s)
DefaultPermissions = permissions.Global()
}
DefaultAccessControl = AccessControl(DefaultPermissions)
+1 -1
View File
@@ -93,7 +93,7 @@ func Initialize(ctx context.Context, log *zap.Logger, s store.Storer, c Config)
if DefaultPermissions == nil {
// Do not override permissions service stored under DefaultPermissions
// to allow integration tests to inject own permission service
DefaultPermissions = permissions.Service(ctx, DefaultLogger, s)
DefaultPermissions = permissions.Global()
}
DefaultAccessControl = AccessControl(DefaultPermissions)
+23 -4
View File
@@ -26,24 +26,43 @@ type (
RuleFilter struct{}
)
var (
// Global permissioning service
gRBAC *service
)
const (
watchInterval = time.Hour
)
// Service initializes service{} struct
// Global returns global RBAC service
func Global() *service {
return gRBAC
}
func Initialize(logger *zap.Logger, s rbacRulesStore) error {
if gRBAC != nil {
// Prevent multiple initializations
return nil
}
gRBAC = NewService(logger, s)
return nil
}
// NewService initializes service{} struct
//
// service{} struct preloads, checks, grants and flushes privileges to and from store
// It acts as a caching layer
func Service(ctx context.Context, logger *zap.Logger, s rbacRulesStore) (svc *service) {
func NewService(logger *zap.Logger, s rbacRulesStore) (svc *service) {
svc = &service{
l: &sync.Mutex{},
f: make(chan bool),
logger: logger.Named("permissions"),
logger: logger.Named("rbac"),
store: s,
}
svc.Reload(ctx)
return
}
+1 -1
View File
@@ -130,7 +130,7 @@ func Initialize(ctx context.Context, log *zap.Logger, s store.Storer, c Config)
if DefaultPermissions == nil {
// Do not override permissions service stored under DefaultPermissions
// to allow integration tests to inject own permission service
DefaultPermissions = permissions.Service(ctx, DefaultLogger, DefaultStore)
DefaultPermissions = permissions.Global()
}
DefaultAccessControl = AccessControl(DefaultPermissions)