Skip to content

Commit a5814ce

Browse files
committed
Updates bootstrap to also create the proper user roles
1 parent ed16473 commit a5814ce

1 file changed

Lines changed: 18 additions & 50 deletions

File tree

apps/opencase/src/infrastructure/keycloak/KeycloakTenantProvisioner.ts

Lines changed: 18 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -37,57 +37,33 @@ export class KeycloakTenantProvisioner {
3737
})
3838

3939
const tenantId = 'system'
40-
const clientId = OidcJwtVerifier.computeTenantClientId(this.cfg.clientIdPrefix, tenantId)
41-
const { id: clientUuid } = await this.admin.ensureClient({
42-
clientId,
43-
publicClient: true,
44-
standardFlowEnabled: true,
45-
redirectUris: this.cfg.spaRedirectUris,
46-
webOrigins: this.cfg.spaWebOrigins
47-
})
48-
49-
await this.admin.ensureClientRole(clientUuid, 'case.admin')
50-
51-
await this.admin.ensureProtocolMapper(clientUuid, {
52-
name: 'tenantId',
53-
protocol: 'openid-connect',
54-
protocolMapper: 'oidc-hardcoded-claim-mapper',
55-
config: {
56-
'claim.name': 'tenantId',
57-
'claim.value': tenantId,
58-
'jsonType.label': 'String',
59-
'id.token.claim': 'true',
60-
'access.token.claim': 'true',
61-
'userinfo.token.claim': 'true'
62-
}
63-
})
64-
65-
await this.admin.ensureProtocolMapper(clientUuid, {
66-
name: 'scope',
67-
protocol: 'openid-connect',
68-
protocolMapper: 'oidc-usermodel-client-role-mapper',
69-
config: {
70-
'clientId': clientId,
71-
'rolePrefix': '',
72-
'claim.name': 'scope',
73-
'jsonType.label': 'String',
74-
'multivalued': 'true',
75-
'access.token.claim': 'true',
76-
'id.token.claim': 'true',
77-
'userinfo.token.claim': 'true'
78-
}
79-
})
40+
const roles = ['case.read', 'case.write', 'case.owner', 'case.admin']
41+
const { clientId, clientUuid } = await this.ensureTenantClient(tenantId, roles)
8042

8143
const { id: userId } = await this.admin.ensureUser({ username: email, email, enabled: true })
8244
await this.admin.setUserPassword(userId, password, false)
83-
await this.admin.assignClientRoles(userId, clientUuid, ['case.admin'])
45+
await this.admin.assignClientRoles(userId, clientUuid, roles)
8446

8547
logger.info({ clientId, email }, 'Bootstrapped system admin user in Keycloak')
8648
}
8749

8850
async provisionTenant (tenantId: string): Promise<{ adminEmail: string, adminPassword: string }> {
8951
await this.admin.ensureRealmExists()
9052

53+
const roles = ['case.read', 'case.write', 'case.owner']
54+
const { clientId, clientUuid } = await this.ensureTenantClient(tenantId, roles)
55+
56+
const adminEmail = `admin@${tenantId}.local`
57+
const { id: userId } = await this.admin.ensureUser({ username: adminEmail, email: adminEmail, enabled: true })
58+
const adminPassword = randomBytes(18).toString('base64url')
59+
await this.admin.setUserPassword(userId, adminPassword, true)
60+
await this.admin.assignClientRoles(userId, clientUuid, roles)
61+
62+
logger.info({ tenantId, clientId, adminEmail }, 'Provisioned tenant client and admin user in Keycloak')
63+
return { adminEmail, adminPassword }
64+
}
65+
66+
private async ensureTenantClient (tenantId: string, roles: string[]): Promise<{ clientId: string, clientUuid: string }> {
9167
const clientId = OidcJwtVerifier.computeTenantClientId(this.cfg.clientIdPrefix, tenantId)
9268
const { id: clientUuid } = await this.admin.ensureClient({
9369
clientId,
@@ -97,7 +73,6 @@ export class KeycloakTenantProvisioner {
9773
webOrigins: this.cfg.spaWebOrigins
9874
})
9975

100-
const roles = ['case.read', 'case.write', 'case.owner']
10176
for (const role of roles) {
10277
await this.admin.ensureClientRole(clientUuid, role)
10378
}
@@ -132,14 +107,7 @@ export class KeycloakTenantProvisioner {
132107
}
133108
})
134109

135-
const adminEmail = `admin@${tenantId}.local`
136-
const { id: userId } = await this.admin.ensureUser({ username: adminEmail, email: adminEmail, enabled: true })
137-
const adminPassword = randomBytes(18).toString('base64url')
138-
await this.admin.setUserPassword(userId, adminPassword, true)
139-
await this.admin.assignClientRoles(userId, clientUuid, roles)
140-
141-
logger.info({ tenantId, clientId, adminEmail }, 'Provisioned tenant client and admin user in Keycloak')
142-
return { adminEmail, adminPassword }
110+
return { clientId, clientUuid }
143111
}
144112
}
145113

0 commit comments

Comments
 (0)