Skip to content

Commit 88f288c

Browse files
authored
feat(scorecard): introduce Scorecard permissions (#1398)
* Add rbac Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> * Introduce permissions Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> * Add tests Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> Assisted-by: Cursor Desktop * Update api Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> * Update docs Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> Assisted-by: Cursor Desktop * Deduplicate Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> * Add list of providers to docs Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com> --------- Signed-off-by: Dominika Zemanovicova <dzemanov@redhat.com>
1 parent 8bdd2eb commit 88f288c

24 files changed

Lines changed: 1183 additions & 55 deletions

File tree

workspaces/scorecard/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ To start the app, run:
88
yarn install
99
yarn start
1010
```
11+
12+
> Notice: The guest user has admin permissions in this application for quick setup. For better control, specify more users and groups in app-config.local.yaml and define a separate admin/admins permission instead of using the guest user. Using the guest user as an admin is not recommended for permission management.

workspaces/scorecard/app-config.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,12 @@ kubernetes:
114114
permission:
115115
# setting this to `false` will disable permissions
116116
enabled: true
117+
rbac:
118+
pluginsWithPermission:
119+
- catalog
120+
- permission
121+
- scaffolder
122+
- scorecard
123+
admin:
124+
users:
125+
- name: user:development/guest

workspaces/scorecard/examples/org.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ apiVersion: backstage.io/v1alpha1
44
kind: User
55
metadata:
66
name: guest
7+
namespace: development
78
spec:
89
memberOf: [guests]
910
---
@@ -12,6 +13,7 @@ apiVersion: backstage.io/v1alpha1
1213
kind: Group
1314
metadata:
1415
name: guests
16+
namespace: development
1517
spec:
1618
type: team
1719
children: []

workspaces/scorecard/packages/app/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"lint": "backstage-cli package lint"
2020
},
2121
"dependencies": {
22+
"@backstage-community/plugin-rbac": "^1.43.0",
2223
"@backstage/app-defaults": "^1.6.4",
2324
"@backstage/catalog-model": "^1.7.5",
2425
"@backstage/cli": "^0.33.1",

workspaces/scorecard/packages/app/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
CatalogImportPage,
2525
catalogImportPlugin,
2626
} from '@backstage/plugin-catalog-import';
27+
import { RbacPage } from '@backstage-community/plugin-rbac';
2728
import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder';
2829
import { orgPlugin } from '@backstage/plugin-org';
2930
import { SearchPage } from '@backstage/plugin-search';
@@ -110,6 +111,7 @@ const routes = (
110111
<ReportIssue />
111112
</TechDocsAddons>
112113
</Route>
114+
<Route path="/rbac" element={<RbacPage />} />;
113115
<Route path="/create" element={<ScaffolderPage />} />
114116
<Route path="/api-docs" element={<ApiExplorerPage />} />
115117
<Route

workspaces/scorecard/packages/app/src/components/Root/Root.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
UserSettingsSignInAvatar,
2727
} from '@backstage/plugin-user-settings';
2828
import { SidebarSearchModal } from '@backstage/plugin-search';
29+
import { Administration } from '@backstage-community/plugin-rbac';
2930
import {
3031
Sidebar,
3132
sidebarConfig,
@@ -90,6 +91,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => (
9091
<SidebarItem icon={ExtensionIcon} to="api-docs" text="APIs" />
9192
<SidebarItem icon={LibraryBooks} to="docs" text="Docs" />
9293
<SidebarItem icon={CreateComponentIcon} to="create" text="Create..." />
94+
<Administration />
9395
{/* End global nav */}
9496
<SidebarDivider />
9597
<SidebarScrollWrapper>

workspaces/scorecard/packages/backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"build-image": "docker build ../.. -f Dockerfile --tag backstage"
2222
},
2323
"dependencies": {
24+
"@backstage-community/plugin-rbac-backend": "^7.2.0",
2425
"@backstage/backend-defaults": "^0.11.1",
2526
"@backstage/config": "^1.3.3",
2627
"@backstage/plugin-app-backend": "^0.5.4",
@@ -33,7 +34,6 @@
3334
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^0.2.10",
3435
"@backstage/plugin-kubernetes-backend": "^0.19.8",
3536
"@backstage/plugin-permission-backend": "^0.7.2",
36-
"@backstage/plugin-permission-backend-module-allow-all-policy": "^0.2.10",
3737
"@backstage/plugin-permission-common": "^0.9.1",
3838
"@backstage/plugin-permission-node": "^0.10.2",
3939
"@backstage/plugin-proxy-backend": "^0.6.4",

workspaces/scorecard/packages/backend/src/index.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ backend.add(import('@backstage/plugin-techdocs-backend'));
2828
backend.add(import('@backstage/plugin-auth-backend'));
2929
// See https://backstage.io/docs/backend-system/building-backends/migrating#the-auth-plugin
3030
backend.add(import('@backstage/plugin-auth-backend-module-guest-provider'));
31+
backend.add(import('@backstage/plugin-auth-backend-module-github-provider'));
3132
// See https://backstage.io/docs/auth/guest/provider
3233

3334
// catalog plugin
@@ -42,9 +43,7 @@ backend.add(import('@backstage/plugin-catalog-backend-module-logs'));
4243
// permission plugin
4344
backend.add(import('@backstage/plugin-permission-backend'));
4445
// See https://backstage.io/docs/permissions/getting-started for how to create your own permission policy
45-
backend.add(
46-
import('@backstage/plugin-permission-backend-module-allow-all-policy'),
47-
);
46+
backend.add(import('@backstage-community/plugin-rbac-backend'));
4847

4948
// search plugin
5049
backend.add(import('@backstage/plugin-search-backend'));

workspaces/scorecard/plugins/scorecard-backend/README.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,70 @@ backend.add(
2121
);
2222
```
2323

24+
## RBAC permissions
25+
26+
Scorecard plugin provides the following permissions:
27+
28+
| Name | Resource Type | Policy | Description | Requirements |
29+
| --------------------- | ---------------- | ------ | ----------------------------------------- | ------------------- |
30+
| scorecard.metric.read | scorecard-metric | read | Allows the user to read scorecard metrics | catalog.entity.read |
31+
32+
### `scorecard.metric.read`
33+
34+
- **Description**: Allows the user to read scorecard metrics
35+
- **Resource Type**: `scorecard-metric`
36+
- **Action**: `read`
37+
38+
This permission controls access to viewing scorecard metrics for entities.
39+
40+
#### Condition `HAS_METRIC_ID`
41+
42+
- Optionally allow access to only specific metrics by their identifiers.
43+
44+
**Example RBAC policies file configuration:**
45+
46+
```csv rbac-policy.csv
47+
g, user:default/<YOUR_USERNAME>, role:default/scorecard-viewer
48+
p, role:default/scorecard-viewer, scorecard.metric.read, read, allow
49+
```
50+
51+
**Example RBAC conditional policies file configuration:**
52+
53+
```YAML rbac-conditions.yaml
54+
---
55+
result: CONDITIONAL
56+
roleEntityRef: "role:default/scorecard-viewer"
57+
pluginId: scorecard
58+
resourceType: scorecard-metric
59+
permissionMapping:
60+
- read
61+
conditions:
62+
rule: HAS_METRIC_ID
63+
resourceType: scorecard-metric
64+
params:
65+
metricIds: ['github.open-prs']
66+
```
67+
68+
This policy would allow users to read only the GitHub Open PRs metric, while restricting access to other available metrics.
69+
2470
## Metric Providers
2571
2672
The Scorecard plugin collects metrics from third-party data sources using metric providers. The Scorecard node plugin provides `scorecardMetricsExtensionPoint` extension point that is used to connect your backend plugin module that exports custom metrics via metric providers to the Scorecard backend plugin. For detailed information on creating metric providers, see [providers.md](./docs/providers.md).
2773

74+
### Available Metric Providers
75+
76+
The following metric providers are available:
77+
78+
| Provider | Metric ID | Title | Description | Type |
79+
| ---------- | ------------------ | ---------------- | ------------------------------------- | ------ |
80+
| **GitHub** | `github.open-prs` | GitHub open PRs | Count of open Pull Requests in GitHub | number |
81+
| **Jira** | `jira.open-issues` | Jira open issues | The number of opened issues in Jira | number |
82+
83+
To use these providers, install the corresponding backend modules:
84+
85+
- GitHub: [`@red-hat-developer-hub/backstage-plugin-scorecard-backend-module-github`](../scorecard-backend-module-github/README.md)
86+
- Jira: [`@red-hat-developer-hub/backstage-plugin-scorecard-backend-module-jira`](../scorecard-backend-module-jira/README.md)
87+
2888
## Thresholds
2989

3090
Thresholds define conditions that determine which category a metric value belongs to (`error`, `warning`, or `success`). The Scorecard plugin provides multiple ways to configure thresholds:

workspaces/scorecard/plugins/scorecard-backend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
"@backstage/catalog-model": "^1.7.5",
4242
"@backstage/errors": "^1.2.7",
4343
"@backstage/plugin-catalog-node": "^1.17.2",
44+
"@backstage/plugin-permission-common": "^0.9.1",
45+
"@backstage/plugin-permission-node": "^0.10.2",
4446
"@red-hat-developer-hub/backstage-plugin-scorecard-common": "workspace:^",
4547
"@red-hat-developer-hub/backstage-plugin-scorecard-node": "workspace:^",
4648
"express": "^4.17.1",

0 commit comments

Comments
 (0)