@backstage-community/plugin-rbac-backend
Version:
165 lines (161 loc) • 6.57 kB
JavaScript
;
var database = require('@backstage/backend-defaults/database');
var catalogClient = require('@backstage/catalog-client');
var casbin = require('casbin');
var casbinAdapterFactory = require('../database/casbin-adapter-factory.cjs.js');
var conditionalStorage = require('../database/conditional-storage.cjs.js');
var migration = require('../database/migration.cjs.js');
var roleMetadata = require('../database/role-metadata.cjs.js');
var allowAllPolicy = require('../policies/allow-all-policy.cjs.js');
var permissionPolicy = require('../policies/permission-policy.cjs.js');
var connectProviders = require('../providers/connect-providers.cjs.js');
var roleManager = require('../role-manager/role-manager.cjs.js');
var enforcerDelegate = require('./enforcer-delegate.cjs.js');
var permissionModel = require('./permission-model.cjs.js');
var pluginEndpoints = require('./plugin-endpoints.cjs.js');
var policiesRestApi = require('./policies-rest-api.cjs.js');
var pluginRbacCommon = require('@backstage-community/plugin-rbac-common');
require('../permissions/conditions.cjs.js');
var rules = require('../permissions/rules.cjs.js');
var resource = require('../permissions/resource.cjs.js');
var extraPermissionEnabledPluginsStorage = require('../database/extra-permission-enabled-plugins-storage.cjs.js');
var extendableIdProvider = require('./extendable-id-provider.cjs.js');
var defaultPermissions = require('../default-permissions/default-permissions.cjs.js');
var conditionValidation = require('../validation/condition-validation.cjs.js');
class PolicyBuilder {
static async build(env, pluginIdProvider = { getPluginIds: () => [] }, rbacProviders) {
const databaseManager = database.DatabaseManager.fromConfig(env.config).forPlugin(
"permission",
{ logger: env.logger, lifecycle: env.lifecycle }
);
const databaseClient = await databaseManager.getClient();
const adapter = await new casbinAdapterFactory.CasbinDBAdapterFactory(
env.config,
databaseClient
).createAdapter();
const enf = await casbin.newEnforcer(casbin.newModelFromString(permissionModel.MODEL), adapter);
await enf.loadPolicy();
enf.enableAutoSave(true);
const catalogClient$1 = new catalogClient.CatalogClient({ discoveryApi: env.discovery });
const catalogDBClient = await database.DatabaseManager.fromConfig(env.config).forPlugin("catalog", { logger: env.logger, lifecycle: env.lifecycle }).getClient();
const defPermReader = new defaultPermissions.DefaultPermissionsReader(env.config);
const rm = new roleManager.BackstageRoleManager(
catalogClient$1,
env.logger,
catalogDBClient,
databaseClient,
env.config,
env.auth,
defPermReader
);
enf.setRoleManager(rm);
enf.enableAutoBuildRoleLinks(false);
await enf.buildRoleLinks();
await migration.migrate(databaseManager);
const conditionStorage = new conditionalStorage.DataBaseConditionalStorage(databaseClient);
const roleMetadataStorage = new roleMetadata.DataBaseRoleMetadataStorage(databaseClient);
const enforcerDelegate$1 = new enforcerDelegate.EnforcerDelegate(
enf,
env.auditor,
conditionStorage,
roleMetadataStorage,
databaseClient
);
const defPermSyncher = new defaultPermissions.DefaultPermissionsSyncher(
roleMetadataStorage,
enforcerDelegate$1,
defPermReader
);
await defPermSyncher.sync();
env.permissionsRegistry.addResourceType({
resourceRef: resource.permissionMetadataResourceRef,
getResources: (resourceRefs) => Promise.all(
resourceRefs.map((ref) => {
if (ref === roleMetadataStorage.getCachedDefaultRoleMetadata()?.roleEntityRef) {
return roleMetadataStorage.getCachedDefaultRoleMetadata();
}
return roleMetadataStorage.findRoleMetadata(ref);
})
),
permissions: pluginRbacCommon.policyEntityPermissions,
rules: Object.values(rules.rules)
});
if (rbacProviders) {
await connectProviders.connectRBACProviders(
rbacProviders,
enforcerDelegate$1,
roleMetadataStorage,
conditionStorage,
env.logger,
env.auditor
);
}
const extraPluginsIdStorage = new extraPermissionEnabledPluginsStorage.PermissionDependentPluginDatabaseStore(
databaseClient
);
const extendablePluginIdProvider = new extendableIdProvider.ExtendablePluginIdProvider(
extraPluginsIdStorage,
pluginIdProvider,
env.config
);
await extendablePluginIdProvider.handleConflictedPluginIds();
const pluginPermMetaData = new pluginEndpoints.PluginPermissionMetadataCollector({
deps: {
discovery: env.discovery,
pluginIdProvider: extendablePluginIdProvider,
logger: env.logger,
config: env.config
}
});
const isPluginEnabled = env.config.getOptionalBoolean("permission.enabled");
const conditionValidationLimits = isPluginEnabled ? conditionValidation.resolveConditionValidationLimits(
conditionValidation.readConditionValidationLimitsFromConfig(env.config)
) : conditionValidation.resolveConditionValidationLimits({});
if (isPluginEnabled) {
env.logger.info("RBAC backend plugin was enabled");
env.policy.setPolicy(
await permissionPolicy.RBACPermissionPolicy.build(
env.logger,
env.auditor,
env.config,
conditionStorage,
enforcerDelegate$1,
roleMetadataStorage,
databaseClient,
pluginPermMetaData,
env.userInfo,
env.auth,
conditionValidationLimits
)
);
} else {
env.logger.warn(
"RBAC backend plugin was disabled by application config permission.enabled: false"
);
env.policy.setPolicy(new allowAllPolicy.AllowAllPolicy());
}
const options = {
config: env.config,
logger: env.logger,
auth: env.auth,
httpAuth: env.httpAuth,
permissions: env.permissions,
permissionsRegistry: env.permissionsRegistry,
auditor: env.auditor
};
const server = new policiesRestApi.PoliciesServer(
options,
enforcerDelegate$1,
conditionStorage,
pluginPermMetaData,
roleMetadataStorage,
extraPluginsIdStorage,
extendablePluginIdProvider,
conditionValidationLimits,
rbacProviders
);
return server.serve();
}
}
exports.PolicyBuilder = PolicyBuilder;
//# sourceMappingURL=policy-builder.cjs.js.map