Skip to content

Commit 264286d

Browse files
authored
feat: Add required_actions attribute to keycloak_user (#867)
1 parent 11b8a66 commit 264286d

File tree

5 files changed

+40
-10
lines changed

5 files changed

+40
-10
lines changed

docs/resources/user.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ resource "keycloak_user" "user_with_initial_password" {
6262
- `first_name` - (Optional) The user's first name.
6363
- `last_name` - (Optional) The user's last name.
6464
- `attributes` - (Optional) A map representing attributes for the user. In order to add multivalue attributes, use `##` to seperate the values. Max length for each value is 255 chars
65+
- `required_actions` - (Optional) A list of required user actions.
6566
- `federated_identity` - (Optional) When specified, the user will be linked to a federated identity provider. Refer to the [federated user example](https://github.com/mrparkers/terraform-provider-keycloak/blob/master/example/federated_user_example.tf) for more details.
6667
- `identity_provider` - (Required) The name of the identity provider
6768
- `user_id` - (Required) The ID of the user defined in the identity provider

keycloak/user.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type User struct {
2525
Enabled bool `json:"enabled"`
2626
Attributes map[string][]string `json:"attributes"`
2727
FederatedIdentities FederatedIdentities `json:"federatedIdentities"`
28+
RequiredActions []string `json:"requiredActions"`
2829
}
2930

3031
type PasswordCredentials struct {
@@ -35,15 +36,16 @@ type PasswordCredentials struct {
3536

3637
func (keycloakClient *KeycloakClient) NewUser(ctx context.Context, user *User) error {
3738
newUser := User{
38-
Id: user.Id,
39-
RealmId: user.RealmId,
40-
Username: user.Username,
41-
Email: user.Email,
42-
EmailVerified: user.EmailVerified,
43-
FirstName: user.FirstName,
44-
LastName: user.LastName,
45-
Enabled: user.Enabled,
46-
Attributes: user.Attributes,
39+
Id: user.Id,
40+
RealmId: user.RealmId,
41+
Username: user.Username,
42+
Email: user.Email,
43+
EmailVerified: user.EmailVerified,
44+
FirstName: user.FirstName,
45+
LastName: user.LastName,
46+
Enabled: user.Enabled,
47+
Attributes: user.Attributes,
48+
RequiredActions: user.RequiredActions,
4749
}
4850
_, location, err := keycloakClient.post(ctx, fmt.Sprintf("/realms/%s/users", user.RealmId), newUser)
4951
if err != nil {

provider/data_source_keycloak_openid_client_service_account_user.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package provider
22

33
import (
44
"context"
5+
56
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
67
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
78
"github.com/mrparkers/terraform-provider-keycloak/keycloak"
@@ -47,6 +48,11 @@ func dataSourceKeycloakOpenidClientServiceAccountUser() *schema.Resource {
4748
Type: schema.TypeMap,
4849
Computed: true,
4950
},
51+
"required_actions": {
52+
Type: schema.TypeSet,
53+
Elem: &schema.Schema{Type: schema.TypeString},
54+
Computed: true,
55+
},
5056
"federated_identity": {
5157
Type: schema.TypeList,
5258
Computed: true,

provider/data_source_keycloak_user.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package provider
22

33
import (
44
"context"
5+
56
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
67
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
78
"github.com/mrparkers/terraform-provider-keycloak/keycloak"
@@ -39,6 +40,11 @@ func dataSourceKeycloakUser() *schema.Resource {
3940
Type: schema.TypeMap,
4041
Computed: true,
4142
},
43+
"required_actions": {
44+
Type: schema.TypeSet,
45+
Elem: &schema.Schema{Type: schema.TypeString},
46+
Computed: true,
47+
},
4248
"federated_identity": {
4349
Type: schema.TypeSet,
4450
Elem: &schema.Schema{Type: schema.TypeString},

provider/resource_keycloak_user.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"strings"
8+
79
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
810
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
911
"github.com/mrparkers/terraform-provider-keycloak/keycloak"
10-
"strings"
1112
)
1213

1314
const MULTIVALUE_ATTRIBUTE_SEPARATOR = "##"
@@ -63,6 +64,11 @@ func resourceKeycloakUser() *schema.Resource {
6364
Type: schema.TypeMap,
6465
Optional: true,
6566
},
67+
"required_actions": {
68+
Type: schema.TypeSet,
69+
Elem: &schema.Schema{Type: schema.TypeString},
70+
Optional: true,
71+
},
6672
"federated_identity": {
6773
Type: schema.TypeSet,
6874
Optional: true,
@@ -118,6 +124,13 @@ func onlyDiffOnCreate(_, _, _ string, d *schema.ResourceData) bool {
118124

119125
func mapFromDataToUser(data *schema.ResourceData) *keycloak.User {
120126
attributes := map[string][]string{}
127+
var requiredActions []string
128+
129+
if v, ok := data.GetOk("required_actions"); ok {
130+
for _, requiredAction := range v.(*schema.Set).List() {
131+
requiredActions = append(requiredActions, requiredAction.(string))
132+
}
133+
}
121134
if v, ok := data.GetOk("attributes"); ok {
122135
for key, value := range v.(map[string]interface{}) {
123136
attributes[key] = strings.Split(value.(string), MULTIVALUE_ATTRIBUTE_SEPARATOR)
@@ -141,6 +154,7 @@ func mapFromDataToUser(data *schema.ResourceData) *keycloak.User {
141154
Enabled: data.Get("enabled").(bool),
142155
Attributes: attributes,
143156
FederatedIdentities: *federatedIdentities,
157+
RequiredActions: requiredActions,
144158
}
145159
}
146160

@@ -182,6 +196,7 @@ func mapFromUserToData(data *schema.ResourceData, user *keycloak.User) {
182196
data.Set("enabled", user.Enabled)
183197
data.Set("attributes", attributes)
184198
data.Set("federated_identity", federatedIdentities)
199+
data.Set("required_actions", user.RequiredActions)
185200
}
186201

187202
func resourceKeycloakUserCreate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {

0 commit comments

Comments
 (0)