@backstage-community/plugin-rbac-backend
Version:
147 lines (143 loc) • 5.58 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');
class PolicyBuilder {
static async build(env, pluginIdProvider = { getPluginIds: () => [] }, rbacProviders) {
let policy;
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 rm = new roleManager.BackstageRoleManager(
catalogClient$1,
env.logger,
catalogDBClient,
databaseClient,
env.config,
env.auth
);
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
);
env.permissionsRegistry.addResourceType({
resourceRef: resource.permissionMetadataResourceRef,
getResources: (resourceRefs) => Promise.all(
resourceRefs.map((ref) => {
return roleMetadataStorage.findRoleMetadata(ref);
})
),
permissions: pluginRbacCommon.policyEntityPermissions,
rules: Object.values(rules.rules)
});
if (rbacProviders) {
await connectProviders.connectRBACProviders(
rbacProviders,
enforcerDelegate$1,
roleMetadataStorage,
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");
if (isPluginEnabled) {
env.logger.info("RBAC backend plugin was enabled");
policy = await permissionPolicy.RBACPermissionPolicy.build(
env.logger,
env.auditor,
env.config,
conditionStorage,
enforcerDelegate$1,
roleMetadataStorage,
databaseClient,
pluginPermMetaData,
env.auth
);
} else {
env.logger.warn(
"RBAC backend plugin was disabled by application config permission.enabled: false"
);
policy = new allowAllPolicy.AllowAllPolicy();
}
const options = {
config: env.config,
logger: env.logger,
discovery: env.discovery,
policy,
auth: env.auth,
httpAuth: env.httpAuth,
userInfo: env.userInfo,
permissions: env.permissions,
permissionsRegistry: env.permissionsRegistry,
auditor: env.auditor
};
const server = new policiesRestApi.PoliciesServer(
options,
enforcerDelegate$1,
conditionStorage,
pluginPermMetaData,
roleMetadataStorage,
extraPluginsIdStorage,
extendablePluginIdProvider,
rbacProviders
);
return server.serve();
}
}
exports.PolicyBuilder = PolicyBuilder;
//# sourceMappingURL=policy-builder.cjs.js.map