permissions: rename permissionIntegrations to permissionsRegistry

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2025-01-09 12:41:58 +01:00
parent dfe6e29c0c
commit cf6bd48cab
27 changed files with 92 additions and 92 deletions
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/backend-test-utils': minor
---
Added mocks for the new `PermissionIntegrationsService`.
Added mocks for the new `PermissionsRegistryService`.
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/backend-defaults': patch
---
Added default implementation for the new `PermissionIntegrationsService`.
Added default implementation for the new `PermissionsRegistryService`.
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/plugin-catalog-backend': minor
---
The catalog backend now supports the new `PermissionIntegrationsService`, which can be used to add custom permission rules.
The catalog backend now supports the new `PermissionsRegistryService`, which can be used to add custom permission rules.
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/plugin-catalog-node': patch
---
Deprecated the alpha `catalogPermissionExtensionPoint` and related types, since the same functionality is now available via the new `PermissionIntegrationsService`.
Deprecated the alpha `catalogPermissionExtensionPoint` and related types, since the same functionality is now available via the new `PermissionsRegistryService`.
+1 -1
View File
@@ -2,4 +2,4 @@
'@backstage/backend-plugin-api': patch
---
Added new `PermissionIntegrationsService` that is used by plugins to register permissions, resource types, and rules into the permission system. This replaces the existing `createPermissionIntegrationRouter` from `@backstage/plugin-permission-node`.
Added new `PermissionsRegistryService` that is used by plugins to register permissions, resource types, and rules into the permission system. This replaces the existing `createPermissionIntegrationRouter` from `@backstage/plugin-permission-node`.
@@ -1,15 +1,15 @@
---
id: permissions
title: Permission Integrations Service
sidebar_label: Permission Integrations
description: Documentation for the Permission Integrations service
title: Permissions Registry Service
sidebar_label: Permissions Registry
description: Documentation for the Permissions Registry service
---
This service allows your plugins to register new permissions, rules, and resource types and integrate with [the permissions framework](../../permissions/overview.md).
## Using the service
For a deep dive into how to use the `permissionIntegrations` service, see the [permission guide for plugin authors](../../permissions/plugin-authors/01-setup.md).
For a deep dive into how to use the `permissionsRegistry` service, see the [permission guide for plugin authors](../../permissions/plugin-authors/01-setup.md).
If all you want to do is add new custom permission rules to an existing plugin, you can instead refer to the [custom permission rules guide](../../permissions/custom-rules.md).
@@ -38,7 +38,7 @@ export async function createRouter() {
}
```
Next, add a dependency on the `PermissionIntegrationsService` to your plugin,
Next, add a dependency on the `PermissionsRegistryService` to your plugin,
and pass it the same options:
```ts
@@ -49,16 +49,16 @@ export const examplePlugin = createBackendPlugin({
deps: {
logger: coreServices.logger,
/* highlight-add-next-line */
permissionIntegrations: coreServices.permissionIntegrations,
permissionsRegistry: coreServices.permissionsRegistry,
},
/* highlight-remove-next-line */
async init({ logger }) {
/* highlight-add-next-line */
async init({ logger, permissionIntegrations }) {
async init({ logger, permissionsRegistry }) {
logger.log('This is a silly example plugin with no functionality');
/* highlight-add-start */
permissionIntegrations.addResourceType({
permissionsRegistry.addResourceType({
resourceType: RESOURCE_TYPE_MY_RESOURCE,
permissions: [myResourcePermissions],
rules: [myResourceRule],
@@ -72,9 +72,9 @@ export const examplePlugin = createBackendPlugin({
If you only passed the `permissions` option to
`createPermissionIntegrationRouter`, you will want to use
`permissionIntegrations.addPermissions` instead.
`permissionsRegistry.addPermissions` instead.
If you passed multiple resources types to `createPermissionIntegrationRouter`
via the `resources` option, you will want to call
`permissionIntegrations.addResourceType` multiple times for each of those
`permissionsRegistry.addResourceType` multiple times for each of those
resource types.
+5 -5
View File
@@ -141,11 +141,11 @@ Now that we have a custom rule defined and added to our policy, we need provide
:::warning Warning
The `PermissionIntegrationsService` is a fairly new addition and not yet supported by all plugins as they might still be using the old `createPermissionIntegrationRouter` that cannot be extended. If you encounter errors when installing custom rules for a plugin, the plugin may need to be switched to using the `PermissionIntegrationsService` first.
The `PermissionsRegistryService` is a fairly new addition and not yet supported by all plugins as they might still be using the old `createPermissionIntegrationRouter` that cannot be extended. If you encounter errors when installing custom rules for a plugin, the plugin may need to be switched to using the `PermissionsRegistryService` first.
:::
To install custom rules in a plugin, we need to use the [`PermissionIntegrationsService`](../backend-system/core-services/permissionIntegrations.md). Here's the steps you'll need to take to add the `isInSystemRule` we created above to the catalog:
To install custom rules in a plugin, we need to use the [`PermissionsRegistryService`](../backend-system/core-services/permissionsRegistry.md). Here's the steps you'll need to take to add the `isInSystemRule` we created above to the catalog:
1. We will be using the `@backstage/plugin-catalog-node` package as it contains the extension point we need. Run this to add it:
@@ -166,9 +166,9 @@ To install custom rules in a plugin, we need to use the [`PermissionIntegrations
moduleId: 'permission-rules',
register(reg) {
reg.registerInit({
deps: { permissionIntegrations: coreServices.permissionIntegrations },
async init({ permissionIntegrations }) {
permissionIntegrations.addPermissionRules([isInSystemRule]);
deps: { permissionsRegistry: coreServices.permissionsRegistry },
async init({ permissionsRegistry }) {
permissionsRegistry.addPermissionRules([isInSystemRule]);
},
});
},
@@ -145,14 +145,14 @@ export const exampleTodoListPlugin = createBackendPlugin({
/* highlight-add-next-line */
permissions: coreServices.permissions,
/* highlight-add-next-line */
permissionIntegrations: coreServices.permissionIntegrations,
permissionsRegistry: coreServices.permissionsRegistry,
},
/* highlight-remove-next-line */
async init({ logger, httpAuth, httpRouter }) {
/* highlight-add-next-line */
async init({ httpAuth, logger, httpRouter, permissions, permissionIntegrations }) {
async init({ httpAuth, logger, httpRouter, permissions, permissionsRegistry }) {
/* highlight-add-next-line */
permissionIntegrations.addPermissions([todoListCreatePermission]);
permissionsRegistry.addPermissions([todoListCreatePermission]);
httpRouter.use(
await createRouter({
@@ -62,9 +62,9 @@ import {
// ...
/* highlight-remove-next-line */
permissionIntegrations.addPermissions([todoListCreatePermission]);
permissionsRegistry.addPermissions([todoListCreatePermission]);
/* highlight-add-start */
permissionIntegrations.addPermissions([
permissionsRegistry.addPermissions([
todoListCreatePermission,
todoListUpdatePermission,
]);
@@ -171,7 +171,7 @@ Specifically, the `apply` function is used to understand whether the passed reso
Let's skip the `toQuery` function for now, we'll come back to that in the next section.
Now, let's add the new resource type to the permissions system via the
`PermissionIntegrationsService`. You'll need to supply:
`PermissionsRegistryService`. You'll need to supply:
- `getResources`: a function that accepts an array of `resourceRefs` in the same format you expect to be passed to `authorize`, and returns an array of the corresponding resources.
- `resourceType`: the same value used in the permission rule above.
@@ -199,13 +199,13 @@ import { rules } from './rules';
// ...
/* highlight-remove-start */
permissionIntegrations.addPermissions([
permissionsRegistry.addPermissions([
todoListCreatePermission,
todoListUpdatePermission,
]);
/* highlight-remove-end */
/* highlight-add-start */
permissionIntegrations.addResourceType({
permissionsRegistry.addResourceType({
resourceType: TODO_LIST_RESOURCE_TYPE,
permissions: [todoListCreatePermission, todoListUpdatePermission],
rules: Object.values(rules),
@@ -97,7 +97,7 @@ import {
// ...
permissionIntegrations.addResourceType({
permissionsRegistry.addResourceType({
resourceType: TODO_LIST_RESOURCE_TYPE,
/* highlight-remove-next-line */
permissions: [todoListCreatePermission, todoListUpdatePermission],
+3 -3
View File
@@ -28,7 +28,7 @@
"./httpRouter": "./src/entrypoints/httpRouter/index.ts",
"./lifecycle": "./src/entrypoints/lifecycle/index.ts",
"./logger": "./src/entrypoints/logger/index.ts",
"./permissionIntegrations": "./src/entrypoints/permissionIntegrations/index.ts",
"./permissionsRegistry": "./src/entrypoints/permissionsRegistry/index.ts",
"./permissions": "./src/entrypoints/permissions/index.ts",
"./rootConfig": "./src/entrypoints/rootConfig/index.ts",
"./rootHealth": "./src/entrypoints/rootHealth/index.ts",
@@ -68,8 +68,8 @@
"logger": [
"src/entrypoints/logger/index.ts"
],
"permissionIntegrations": [
"src/entrypoints/permissionIntegrations/index.ts"
"permissionsRegistry": [
"src/entrypoints/permissionsRegistry/index.ts"
],
"permissions": [
"src/entrypoints/permissions/index.ts"
@@ -3,12 +3,12 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
import { PermissionIntegrationsService } from '@backstage/backend-plugin-api';
import { PermissionsRegistryService } from '@backstage/backend-plugin-api';
import { ServiceFactory } from '@backstage/backend-plugin-api';
// @public
export const permissionIntegrationsServiceFactory: ServiceFactory<
PermissionIntegrationsService,
export const permissionsRegistryServiceFactory: ServiceFactory<
PermissionsRegistryService,
'plugin',
'singleton'
>;
@@ -23,8 +23,8 @@ import { httpAuthServiceFactory } from '@backstage/backend-defaults/httpAuth';
import { httpRouterServiceFactory } from '@backstage/backend-defaults/httpRouter';
import { lifecycleServiceFactory } from '@backstage/backend-defaults/lifecycle';
import { loggerServiceFactory } from '@backstage/backend-defaults/logger';
import { permissionIntegrationsServiceFactory } from '@backstage/backend-defaults/permissionIntegrations';
import { permissionsServiceFactory } from '@backstage/backend-defaults/permissions';
import { permissionsRegistryServiceFactory } from '@backstage/backend-defaults/permissionsRegistry';
import { rootConfigServiceFactory } from '@backstage/backend-defaults/rootConfig';
import { rootHealthServiceFactory } from '@backstage/backend-defaults/rootHealth';
import { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter';
@@ -45,8 +45,8 @@ export const defaultServiceFactories = [
httpRouterServiceFactory,
lifecycleServiceFactory,
loggerServiceFactory,
permissionIntegrationsServiceFactory,
permissionsServiceFactory,
permissionsRegistryServiceFactory,
rootHealthServiceFactory,
rootHttpRouterServiceFactory,
rootLifecycleServiceFactory,
@@ -14,4 +14,4 @@
* limitations under the License.
*/
export { permissionIntegrationsServiceFactory } from './permissionIntegrationsServiceFactory';
export { permissionsRegistryServiceFactory } from './permissionsRegistryServiceFactory';
@@ -23,14 +23,14 @@ import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-
/**
* Permission system integration for registering resources and permissions.
*
* See {@link @backstage/code-plugin-api#PermissionIntegrationsService}
* See {@link @backstage/code-plugin-api#PermissionsRegistryService}
* and {@link https://backstage.io/docs/backend-system/core-services/permission-integrations | the service docs}
* for more information.
*
* @public
*/
export const permissionIntegrationsServiceFactory = createServiceFactory({
service: coreServices.permissionIntegrations,
export const permissionsRegistryServiceFactory = createServiceFactory({
service: coreServices.permissionsRegistry,
deps: {
lifecycle: coreServices.lifecycle,
httpRouter: coreServices.httpRouter,
+5 -5
View File
@@ -186,8 +186,8 @@ export namespace coreServices {
const lifecycle: ServiceRef<LifecycleService, 'plugin', 'singleton'>;
const logger: ServiceRef<LoggerService, 'plugin', 'singleton'>;
const permissions: ServiceRef<PermissionsService, 'plugin', 'singleton'>;
const permissionIntegrations: ServiceRef<
PermissionIntegrationsService,
const permissionsRegistry: ServiceRef<
PermissionsRegistryService,
'plugin',
'singleton'
>;
@@ -433,11 +433,11 @@ export interface LoggerService {
}
// @public
export interface PermissionIntegrationsService {
export interface PermissionsRegistryService {
addPermissionRules(rules: PermissionRule<any, any, string>[]): void;
addPermissions(permissions: Permission[]): void;
addResourceType<const TResourceType extends string, TResource>(
options: PermissionIntegrationsServiceAddResourceTypeOptions<
options: PermissionsRegistryServiceAddResourceTypeOptions<
TResourceType,
TResource
>,
@@ -445,7 +445,7 @@ export interface PermissionIntegrationsService {
}
// @public
export type PermissionIntegrationsServiceAddResourceTypeOptions<
export type PermissionsRegistryServiceAddResourceTypeOptions<
TResourceType extends string,
TResource,
> = {
@@ -30,7 +30,7 @@ type NoInfer<T> = T extends infer S ? S : never;
*
* @public
*/
export type PermissionIntegrationsServiceAddResourceTypeOptions<
export type PermissionsRegistryServiceAddResourceTypeOptions<
TResourceType extends string,
TResource,
> = {
@@ -71,7 +71,7 @@ export type PermissionIntegrationsServiceAddResourceTypeOptions<
*
* @public
*/
export interface PermissionIntegrationsService {
export interface PermissionsRegistryService {
/**
* Add permissions for this plugin to the permission system.
*/
@@ -117,13 +117,13 @@ export interface PermissionIntegrationsService {
* The `getResources` argument should load resources based on a reference
* identifier. For the catalog, this is an
* {@link @backstage/catalog-model#EntityRef}. For other plugins, this can be
* any serialized format. This is used to add a permission integrations API
* any serialized format. This is used to add a permissions registry API
* via the HTTP router service. This API will be called by the
* `permission-backend` when authorization conditions relating to this plugin
* need to be evaluated.
*/
addResourceType<const TResourceType extends string, TResource>(
options: PermissionIntegrationsServiceAddResourceTypeOptions<
options: PermissionsRegistryServiceAddResourceTypeOptions<
TResourceType,
TResource
>,
@@ -177,15 +177,15 @@ export namespace coreServices {
/**
* Permission system integration for registering resources and permissions.
*
* See {@link PermissionIntegrationsService}
* See {@link PermissionsRegistryService}
* and {@link https://backstage.io/docs/backend-system/core-services/permission-integrations | the service docs}
* for more information.
*
* @public
*/
export const permissionIntegrations = createServiceRef<
import('./PermissionIntegrationsService').PermissionIntegrationsService
>({ id: 'core.permissionIntegrations' });
export const permissionsRegistry = createServiceRef<
import('./PermissionsRegistryService').PermissionsRegistryService
>({ id: 'core.permissionsRegistry' });
/**
* Built-in service for accessing metadata about the current plugin.
@@ -51,9 +51,9 @@ export type {
PermissionsServiceRequestOptions,
} from './PermissionsService';
export type {
PermissionIntegrationsService,
PermissionIntegrationsServiceAddResourceTypeOptions,
} from './PermissionIntegrationsService';
PermissionsRegistryService,
PermissionsRegistryServiceAddResourceTypeOptions,
} from './PermissionsRegistryService';
export type { PluginMetadataService } from './PluginMetadataService';
export type { RootHttpRouterService } from './RootHttpRouterService';
export type { RootLifecycleService } from './RootLifecycleService';
+14 -14
View File
@@ -33,7 +33,7 @@ import { LifecycleService } from '@backstage/backend-plugin-api';
import { LoggerService } from '@backstage/backend-plugin-api';
import { ParamsDictionary } from 'express-serve-static-core';
import { ParsedQs } from 'qs';
import { PermissionIntegrationsService } from '@backstage/backend-plugin-api';
import { PermissionsRegistryService } from '@backstage/backend-plugin-api';
import { PermissionsService } from '@backstage/backend-plugin-api';
import { RootConfigService } from '@backstage/backend-plugin-api';
import { RootHealthService } from '@backstage/backend-plugin-api';
@@ -256,19 +256,6 @@ export namespace mockServices {
) => ServiceMock<LoggerService>;
}
// (undocumented)
export namespace permissionIntegrations {
const // (undocumented)
factory: () => ServiceFactory<
PermissionIntegrationsService,
'plugin',
'singleton'
>;
const // (undocumented)
mock: (
partialImpl?: Partial<PermissionIntegrationsService> | undefined,
) => ServiceMock<PermissionIntegrationsService>;
}
// (undocumented)
export namespace permissions {
const // (undocumented)
factory: () => ServiceFactory<PermissionsService, 'plugin', 'singleton'>;
@@ -278,6 +265,19 @@ export namespace mockServices {
) => ServiceMock<PermissionsService>;
}
// (undocumented)
export namespace permissionsRegistry {
const // (undocumented)
factory: () => ServiceFactory<
PermissionsRegistryService,
'plugin',
'singleton'
>;
const // (undocumented)
mock: (
partialImpl?: Partial<PermissionsRegistryService> | undefined,
) => ServiceMock<PermissionsRegistryService>;
}
// (undocumented)
export function rootConfig(options?: rootConfig.Options): RootConfigService;
// (undocumented)
export namespace rootConfig {
@@ -53,7 +53,7 @@ import { MockRootLoggerService } from './MockRootLoggerService';
import { MockUserInfoService } from './MockUserInfoService';
import { mockCredentials } from './mockCredentials';
import { Knex } from 'knex';
import { permissionIntegrationsServiceFactory } from '@backstage/backend-defaults/permissionIntegrations';
import { permissionsRegistryServiceFactory } from '@backstage/backend-defaults/permissionsRegistry';
/** @internal */
function createLoggerMock() {
@@ -469,9 +469,9 @@ export namespace mockServices {
}));
}
export namespace permissionIntegrations {
export const factory = () => permissionIntegrationsServiceFactory;
export const mock = simpleMock(coreServices.permissionIntegrations, () => ({
export namespace permissionsRegistry {
export const factory = () => permissionsRegistryServiceFactory;
export const mock = simpleMock(coreServices.permissionsRegistry, () => ({
addPermissionRules: jest.fn(),
addPermissions: jest.fn(),
addResourceType: jest.fn(),
@@ -75,7 +75,7 @@ export const defaultServiceFactories = [
mockServices.lifecycle.factory(),
mockServices.logger.factory(),
mockServices.permissions.factory(),
mockServices.permissionIntegrations.factory(),
mockServices.permissionsRegistry.factory(),
mockServices.rootHealth.factory(),
mockServices.rootLifecycle.factory(),
mockServices.rootLogger.factory(),
+2 -2
View File
@@ -49,9 +49,9 @@ import { locationSpecToMetadataName as locationSpecToMetadataName_2 } from '@bac
import { LoggerService } from '@backstage/backend-plugin-api';
import { Permission } from '@backstage/plugin-permission-common';
import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
import { PermissionIntegrationsService } from '@backstage/backend-plugin-api';
import { PermissionRule } from '@backstage/plugin-permission-node';
import { PermissionRuleParams } from '@backstage/plugin-permission-common';
import { PermissionsRegistryService } from '@backstage/backend-plugin-api';
import { PermissionsService } from '@backstage/backend-plugin-api';
import { PlaceholderResolver as PlaceholderResolver_2 } from '@backstage/plugin-catalog-node';
import { PlaceholderResolverParams as PlaceholderResolverParams_2 } from '@backstage/plugin-catalog-node';
@@ -199,7 +199,7 @@ export type CatalogEnvironment = {
config: RootConfigService;
reader: UrlReaderService;
permissions: PermissionsService | PermissionAuthorizer;
permissionIntegrations?: PermissionIntegrationsService;
permissionsRegistry?: PermissionsRegistryService;
scheduler?: SchedulerService;
discovery?: DiscoveryService;
auth?: AuthService;
@@ -114,7 +114,7 @@ import {
RootConfigService,
UrlReaderService,
SchedulerService,
PermissionIntegrationsService,
PermissionsRegistryService,
} from '@backstage/backend-plugin-api';
import { entitiesResponseToObjects } from './response';
@@ -137,7 +137,7 @@ export type CatalogEnvironment = {
config: RootConfigService;
reader: UrlReaderService;
permissions: PermissionsService | PermissionAuthorizer;
permissionIntegrations?: PermissionIntegrationsService;
permissionsRegistry?: PermissionsRegistryService;
scheduler?: SchedulerService;
discovery?: DiscoveryService;
auth?: AuthService;
@@ -480,7 +480,7 @@ export class CatalogBuilder {
logger,
permissions,
scheduler,
permissionIntegrations,
permissionsRegistry,
discovery = HostDiscovery.fromConfig(config),
} = this.env;
@@ -593,8 +593,8 @@ export class CatalogBuilder {
let permissionIntegrationRouter:
| ReturnType<typeof createPermissionIntegrationRouter>
| undefined;
if (permissionIntegrations) {
permissionIntegrations.addResourceType(catalogPermissionResource);
if (permissionsRegistry) {
permissionsRegistry.addResourceType(catalogPermissionResource);
} else {
permissionIntegrationRouter = createPermissionIntegrationRouter(
catalogPermissionResource,
@@ -33,10 +33,10 @@ describe('catalogPlugin', () => {
register(reg) {
reg.registerInit({
deps: {
permissionIntegrations: coreServices.permissionIntegrations,
permissionsRegistry: coreServices.permissionsRegistry,
},
async init({ permissionIntegrations }) {
permissionIntegrations.addPermissionRules([
async init({ permissionsRegistry }) {
permissionsRegistry.addPermissionRules([
createCatalogPermissionRule({
name: 'test',
resourceType: 'catalog-entity',
@@ -227,7 +227,7 @@ export const catalogPlugin = createBackendPlugin({
config: coreServices.rootConfig,
reader: coreServices.urlReader,
permissions: coreServices.permissions,
permissionIntegrations: coreServices.permissionIntegrations,
permissionsRegistry: coreServices.permissionsRegistry,
database: coreServices.database,
httpRouter: coreServices.httpRouter,
lifecycle: coreServices.rootLifecycle,
@@ -243,7 +243,7 @@ export const catalogPlugin = createBackendPlugin({
reader,
database,
permissions,
permissionIntegrations,
permissionsRegistry,
httpRouter,
lifecycle,
scheduler,
@@ -256,7 +256,7 @@ export const catalogPlugin = createBackendPlugin({
config,
reader,
permissions,
permissionIntegrations,
permissionsRegistry,
database,
scheduler,
logger,
+3 -3
View File
@@ -138,7 +138,7 @@ export const catalogModelExtensionPoint =
/**
* @alpha
* @deprecated Use the `coreServices.permissionIntegrations` instead.
* @deprecated Use the `coreServices.permissionsRegistry` instead.
*/
export type CatalogPermissionRuleInput<
TParams extends PermissionRuleParams = PermissionRuleParams,
@@ -146,7 +146,7 @@ export type CatalogPermissionRuleInput<
/**
* @alpha
* @deprecated Use the `coreServices.permissionIntegrations` instead.
* @deprecated Use the `coreServices.permissionsRegistry` instead.
*/
export interface CatalogPermissionExtensionPoint {
addPermissions(...permissions: Array<Permission | Array<Permission>>): void;
@@ -159,7 +159,7 @@ export interface CatalogPermissionExtensionPoint {
/**
* @alpha
* @deprecated Use the `coreServices.permissionIntegrations` instead.
* @deprecated Use the `coreServices.permissionsRegistry` instead.
*/
export const catalogPermissionExtensionPoint =
createExtensionPoint<CatalogPermissionExtensionPoint>({