Skip to content

Commit d0a4531

Browse files
authored
feat(orchestrator): add permissions to orchestrator plugin (#1599)
Motivation Workflows create assets and retrieve data from external parties. Those created assets are non-trivial by nature, cost money and time and the data retrieved should be kept for federated. For this reason we are introducing permission on the various route entries of the orchestrator. Modification All the route entries of the orchestrator backend plugin will run an authorization check All frontend calls to the backend will pass identity when its available Result Orchestrator interactions requires authorization to execute workflow and view their outcomes. Signed-off-by: Roy Golan <[email protected]>
1 parent 0b36164 commit d0a4531

File tree

16 files changed

+471
-90
lines changed

16 files changed

+471
-90
lines changed

plugins/orchestrator-backend/dev/index.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
import { createServiceBuilder, UrlReader } from '@backstage/backend-common';
1+
import {
2+
createServiceBuilder,
3+
ServerTokenManager,
4+
UrlReader,
5+
} from '@backstage/backend-common';
6+
import { DiscoveryService } from '@backstage/backend-plugin-api';
27
import { PluginTaskScheduler } from '@backstage/backend-tasks';
38
import { CatalogApi } from '@backstage/catalog-client';
49
import { Config } from '@backstage/config';
5-
import { DiscoveryApi } from '@backstage/core-plugin-api';
10+
import { ServerPermissionClient } from '@backstage/plugin-permission-node';
611

712
import { Logger } from 'winston';
813

@@ -15,7 +20,7 @@ export interface ServerOptions {
1520
enableCors: boolean;
1621
logger: Logger;
1722
config: Config;
18-
discovery: DiscoveryApi;
23+
discovery: DiscoveryService;
1924
catalogApi: CatalogApi;
2025
urlReader: UrlReader;
2126
scheduler: PluginTaskScheduler;
@@ -26,13 +31,20 @@ export async function startStandaloneServer(
2631
): Promise<Server> {
2732
const logger = options.logger.child({ service: 'orchestrator-backend' });
2833
logger.debug('Starting application server...');
34+
35+
const permissions = ServerPermissionClient.fromConfig(options.config, {
36+
discovery: options.discovery,
37+
tokenManager: ServerTokenManager.noop(),
38+
});
39+
2940
const router = await createRouter({
3041
logger: logger,
3142
config: options.config,
3243
discovery: options.discovery,
3344
catalogApi: options.catalogApi,
3445
urlReader: options.urlReader,
3546
scheduler: options.scheduler,
47+
permissions: permissions,
3648
});
3749

3850
let service = createServiceBuilder(module)

plugins/orchestrator-backend/dist-dynamic/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"@backstage/backend-app-api": "^0.7.2",
6161
"@backstage/backend-common": "^0.21.7",
6262
"@backstage/backend-dynamic-feature-service": "^0.2.9",
63+
"@backstage/errors": "^1.2.4",
6364
"@backstage/backend-plugin-api": "^0.6.17",
6465
"@backstage/backend-tasks": "^0.5.22",
6566
"@backstage/catalog-client": "^1.6.4",
@@ -71,6 +72,9 @@
7172
"@backstage/plugin-events-node": "^0.3.3",
7273
"@backstage/plugin-scaffolder-backend": "^1.22.5",
7374
"@backstage/plugin-scaffolder-node": "^0.4.3",
75+
"@backstage/plugin-permission-common": "^0.7.13",
76+
"@backstage/plugin-permission-node": "^0.7.27",
77+
"@backstage/plugin-auth-node": "^0.4.11",
7478
"@backstage/types": "^1.1.1"
7579
},
7680
"overrides": {

plugins/orchestrator-backend/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
"@backstage/backend-app-api": "^0.7.2",
6161
"@backstage/backend-common": "^0.21.7",
6262
"@backstage/backend-dynamic-feature-service": "^0.2.9",
63+
"@backstage/errors": "^1.2.4",
6364
"@backstage/backend-plugin-api": "^0.6.17",
6465
"@backstage/backend-tasks": "^0.5.22",
6566
"@backstage/catalog-client": "^1.6.4",
@@ -71,6 +72,9 @@
7172
"@backstage/plugin-events-node": "^0.3.3",
7273
"@backstage/plugin-scaffolder-backend": "^1.22.5",
7374
"@backstage/plugin-scaffolder-node": "^0.4.3",
75+
"@backstage/plugin-permission-common": "^0.7.13",
76+
"@backstage/plugin-permission-node": "^0.7.27",
77+
"@backstage/plugin-auth-node": "^0.4.11",
7478
"@backstage/types": "^1.1.1",
7579
"@janus-idp/backstage-plugin-orchestrator-common": "1.7.2",
7680
"@urql/core": "^4.1.4",

plugins/orchestrator-backend/src/OrchestratorPlugin.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export const orchestratorPlugin = createBackendPlugin({
1818
httpRouter: coreServices.httpRouter,
1919
urlReader: coreServices.urlReader,
2020
scheduler: coreServices.scheduler,
21+
permissions: coreServices.permissions,
22+
httpAuth: coreServices.httpAuth,
2123
catalogApi: catalogServiceRef,
2224
},
2325
async init({
@@ -28,6 +30,8 @@ export const orchestratorPlugin = createBackendPlugin({
2830
catalogApi,
2931
urlReader,
3032
scheduler,
33+
permissions,
34+
httpAuth,
3135
}) {
3236
const log = loggerToWinstonLogger(logger);
3337
const router = await createRouter({
@@ -37,6 +41,8 @@ export const orchestratorPlugin = createBackendPlugin({
3741
catalogApi: catalogApi,
3842
urlReader: urlReader,
3943
scheduler: scheduler,
44+
permissions: permissions,
45+
httpAuth: httpAuth,
4046
});
4147
httpRouter.use(router);
4248
},

plugins/orchestrator-backend/src/routerWrapper/index.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { UrlReader } from '@backstage/backend-common';
1+
import { createLegacyAuthAdapters, UrlReader } from '@backstage/backend-common';
2+
import {
3+
DiscoveryService,
4+
HttpAuthService,
5+
PermissionsService,
6+
} from '@backstage/backend-plugin-api';
27
import { PluginTaskScheduler } from '@backstage/backend-tasks';
38
import { CatalogApi } from '@backstage/catalog-client';
49
import { Config } from '@backstage/config';
5-
import { DiscoveryApi } from '@backstage/core-plugin-api';
610

711
import express from 'express';
812
import { Logger } from 'winston';
@@ -13,10 +17,12 @@ import { createBackendRouter } from '../service/router';
1317
export interface RouterArgs {
1418
config: Config;
1519
logger: Logger;
16-
discovery: DiscoveryApi;
20+
discovery: DiscoveryService;
1721
catalogApi: CatalogApi;
1822
urlReader: UrlReader;
1923
scheduler: PluginTaskScheduler;
24+
permissions: PermissionsService;
25+
httpAuth?: HttpAuthService;
2026
}
2127

2228
export async function createRouter(args: RouterArgs): Promise<express.Router> {
@@ -35,12 +41,18 @@ export async function createRouter(args: RouterArgs): Promise<express.Router> {
3541
}
3642
}
3743

44+
const { httpAuth } = createLegacyAuthAdapters({
45+
httpAuth: args.httpAuth,
46+
discovery: args.discovery,
47+
});
3848
return await createBackendRouter({
3949
config: args.config,
4050
logger: args.logger,
4151
discovery: args.discovery,
4252
catalogApi: args.catalogApi,
4353
urlReader: args.urlReader,
4454
scheduler: args.scheduler,
55+
permissions: args.permissions,
56+
httpAuth: httpAuth,
4557
});
4658
}

plugins/orchestrator-backend/src/service/DevModeService.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ export class DevModeService {
136136
launcherArgs.push(`--add-host`, `jira.test:${this.connection.jira.host}`);
137137
}
138138

139-
launcherArgs.push('--rm');
140139
launcherArgs.push('-e', `QUARKUS_HTTP_PORT=${this.connection.port}`);
141140

142141
launcherArgs.push('-p', `${this.connection.port}:${this.connection.port}`);

0 commit comments

Comments
 (0)