Skip to content

Commit 5c09013

Browse files
authored
Merge pull request #10 from movewp3/fix/SupportMultipleAdditionalDefaultClientSCopes
feat: [PACLOUD-386] Support Multiple Additional Default Client Scopes
2 parents ca20709 + 979a938 commit 5c09013

3 files changed

Lines changed: 40 additions & 19 deletions

File tree

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Build the manager binary
2-
FROM golang:1.21.11 as builder
2+
FROM golang:1.21.11 AS builder
33

44
WORKDIR /workspace
55
# Copy the Go Modules manifests

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ A basic configuration for the keycloakcontroller consists of
1616

1717
* optional secret credential-keycloak-client-secret-seed in namespace des controllers
1818
* SECRET_SEED if the secret for each client should be created via a sha code of (secret-seed + client-name). This is sometimes necessary if a controller should be running in twho separate k8s clusters.
19-
* optional defaultClientScope for public KeycloakClients. For KeycloakClients, the defaultClientScopes are usually configured in the KeycloakClient CustomResource.
20-
If a certain defaultClientScope is needed in every KeycloakClient, e.g. the Scope "Nonce" for all the public KeycloakClients after the Keycloak25 Update, then this can be configured with the environment Variable ADDITIONAL_DEFAULT_CLIENT_SCOPE and in the case the value "Nonce" (without changing all the KeycloakClient CustomResources)
19+
* optional defaultClientScopes for public KeycloakClients. For KeycloakClients, the defaultClientScopes are usually configured in the KeycloakClient CustomResource.
20+
If a certain defaultClientScope is needed in every KeycloakClient, e.g. the Scopes "Nonce" and "basic" for all the public KeycloakClients after the Keycloak25 Update, then this can be configured with the environment Variable ADDITIONAL_DEFAULT_CLIENT_SCOPES and in the case the value "Nonce,basic" (without changing all the KeycloakClient CustomResources)
2121

2222

2323

pkg/common/cluster_actions.go

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"slices"
8+
"strings"
89

910
"github.com/movewp3/keycloakclient-controller/api/v1alpha1"
1011
"github.com/movewp3/keycloakclient-controller/pkg/util"
@@ -135,13 +136,13 @@ func (i *ClusterActionRunner) CreateRealm(obj *v1alpha1.KeycloakRealm) error {
135136
return err
136137
}
137138

138-
func getAdditionalDefaultClientScope() string {
139-
140-
additionalDefaultClientScope, found := os.LookupEnv("ADDITIONAL_DEFAULT_CLIENT_SCOPE")
139+
func getAdditionalDefaultClientScopes() []string {
140+
additionalDefaultClientScopes, found := os.LookupEnv("ADDITIONAL_DEFAULT_CLIENT_SCOPES")
141141
if !found {
142-
return ""
142+
return []string{}
143143
}
144-
return additionalDefaultClientScope
144+
145+
return strings.Split(additionalDefaultClientScopes, ",")
145146
}
146147

147148
func (i *ClusterActionRunner) CreateClient(obj *v1alpha1.KeycloakClient, realm string) error {
@@ -150,22 +151,25 @@ func (i *ClusterActionRunner) CreateClient(obj *v1alpha1.KeycloakClient, realm s
150151
return errors.Errorf("cannot perform client create when client is nil")
151152
}
152153

153-
oldClientScopes := []string{}
154+
oldClientScopes := obj.Spec.Client.DefaultClientScopes
154155
addedDefaultClientScope := false
155156

156-
if getAdditionalDefaultClientScope() != "" && !slices.Contains(obj.Spec.Client.DefaultClientScopes, getAdditionalDefaultClientScope()) && obj.Spec.Client.PublicClient {
157-
log.Info(fmt.Sprintf("Add default client scope %v",
158-
getAdditionalDefaultClientScope()))
159-
160-
oldClientScopes = obj.Spec.Client.DefaultClientScopes
161-
addedDefaultClientScope = true
162-
obj.Spec.Client.DefaultClientScopes = append(obj.Spec.Client.DefaultClientScopes, getAdditionalDefaultClientScope())
163-
157+
additionalDefaultClientScopes := obj.Spec.Client.DefaultClientScopes
158+
if obj.Spec.Client.PublicClient {
159+
for _, scope := range getAdditionalDefaultClientScopes() {
160+
if !slices.Contains(obj.Spec.Client.DefaultClientScopes, scope) {
161+
addedDefaultClientScope = true
162+
log.Info(fmt.Sprintf("Add default client scope %v",
163+
getAdditionalDefaultClientScopes()))
164+
additionalDefaultClientScopes = append(additionalDefaultClientScopes, scope)
165+
}
166+
}
164167
defer func() {
165168
obj.Spec.Client.DefaultClientScopes = oldClientScopes
166169
}()
167170

168171
}
172+
obj.Spec.Client.DefaultClientScopes = additionalDefaultClientScopes
169173

170174
uid, err := i.keycloakClient.CreateClient(obj.Spec.Client, realm)
171175

@@ -184,8 +188,8 @@ func (i *ClusterActionRunner) CreateClient(obj *v1alpha1.KeycloakClient, realm s
184188
}
185189
if addedDefaultClientScope {
186190
obj.Spec.Client.DefaultClientScopes = oldClientScopes
187-
log.Info(fmt.Sprintf("Removed additional client scope (%s) from keycloak client %v",
188-
getAdditionalDefaultClientScope(), obj.Name))
191+
log.Info(fmt.Sprintf("Removed additional client scope from keycloak client %v",
192+
obj.Name))
189193
}
190194

191195
return i.client.Update(i.context, obj)
@@ -211,6 +215,23 @@ func (i *ClusterActionRunner) CreateClient(obj *v1alpha1.KeycloakClient, realm s
211215

212216
if err == nil {
213217
obj.Spec.Client.ID = uid
218+
// keycloak CR is updated here with uid
219+
log.Info(fmt.Sprintf("Update K8S Keycloakclient %v",
220+
obj.Name))
221+
222+
// if secret was generated via seed secret, then dont store it
223+
sha, errsha := util.GetClientShaCode(obj.Spec.Client.ClientID)
224+
if errsha == nil && sha == obj.Spec.Client.Secret {
225+
obj.Spec.Client.Secret = ""
226+
log.Info(fmt.Sprintf("Removed secret (generated from secretSeed) from keycloak client %v",
227+
obj.Name))
228+
}
229+
if addedDefaultClientScope {
230+
obj.Spec.Client.DefaultClientScopes = oldClientScopes
231+
log.Info(fmt.Sprintf("Removed additional client scope from keycloak client %v",
232+
obj.Name))
233+
}
234+
214235
return i.client.Update(i.context, obj)
215236
}
216237
}

0 commit comments

Comments
 (0)