Skip to content

Commit 6e6f244

Browse files
committed
fix: claims for userroles
1 parent 57ed0a1 commit 6e6f244

File tree

5 files changed

+133
-0
lines changed

5 files changed

+133
-0
lines changed

recipe/userroles/claims.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package userroles
2+
3+
import (
4+
"github.com/supertokens/supertokens-golang/recipe/session/claims"
5+
urclaims "github.com/supertokens/supertokens-golang/recipe/userroles/claims"
6+
"github.com/supertokens/supertokens-golang/supertokens"
7+
)
8+
9+
func init() {
10+
urclaims.UserRoleClaim = NewUserRoleClaim()
11+
urclaims.PermissionClaim = NewPermissionClaim()
12+
}
13+
14+
func NewUserRoleClaim() *urclaims.TypeUserRoleClaim {
15+
fetchValue := func(userId string, userContext supertokens.UserContext) (interface{}, error) {
16+
recipe, err := getRecipeInstanceOrThrowError()
17+
if err != nil {
18+
return nil, err
19+
}
20+
roles, err := (*recipe.RecipeImpl.GetRolesForUser)(userId, userContext)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
rolesArray := make([]interface{}, len(roles.OK.Roles))
26+
for i, role := range roles.OK.Roles {
27+
rolesArray[i] = role
28+
}
29+
return rolesArray, nil
30+
}
31+
32+
primitiveArrayClaim := claims.PrimitiveArrayClaim("st-role", fetchValue, nil)
33+
return &urclaims.TypeUserRoleClaim{
34+
TypePrimitiveArrayClaim: primitiveArrayClaim,
35+
Validators: &urclaims.TypeUserRoleClaimValidators{
36+
PrimitiveArrayClaimValidators: primitiveArrayClaim.Validators,
37+
},
38+
}
39+
}
40+
41+
func NewPermissionClaim() *urclaims.TypePermissionClaim {
42+
fetchValue := func(userId string, userContext supertokens.UserContext) (interface{}, error) {
43+
recipe, err := getRecipeInstanceOrThrowError()
44+
if err != nil {
45+
return nil, err
46+
}
47+
roles, err := (*recipe.RecipeImpl.GetRolesForUser)(userId, userContext)
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
permissionSet := map[string]bool{}
53+
for _, role := range roles.OK.Roles {
54+
permissions, err := (*recipe.RecipeImpl.GetPermissionsForRole)(role, userContext)
55+
if err != nil {
56+
return nil, err
57+
}
58+
for _, permission := range permissions.OK.Permissions {
59+
permissionSet[permission] = true
60+
}
61+
}
62+
63+
result := []interface{}{}
64+
65+
for perm := range permissionSet {
66+
result = append(result, perm)
67+
}
68+
69+
return result, nil
70+
}
71+
72+
primitiveArrayClaim := claims.PrimitiveArrayClaim("st-perm", fetchValue, nil)
73+
return &urclaims.TypePermissionClaim{
74+
TypePrimitiveArrayClaim: primitiveArrayClaim,
75+
Validators: &urclaims.TypePermissionClaimValidators{
76+
PrimitiveArrayClaimValidators: primitiveArrayClaim.Validators,
77+
},
78+
}
79+
}

recipe/userroles/claims/claims.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package claims
2+
3+
import "github.com/supertokens/supertokens-golang/recipe/session/claims"
4+
5+
type TypeUserRoleClaim struct {
6+
*claims.TypePrimitiveArrayClaim
7+
Validators *TypeUserRoleClaimValidators
8+
}
9+
10+
type TypeUserRoleClaimValidators struct {
11+
*claims.PrimitiveArrayClaimValidators
12+
}
13+
14+
var UserRoleClaim *TypeUserRoleClaim
15+
16+
type TypePermissionClaim struct {
17+
*claims.TypePrimitiveArrayClaim
18+
Validators *TypePermissionClaimValidators
19+
}
20+
21+
type TypePermissionClaimValidators struct {
22+
*claims.PrimitiveArrayClaimValidators
23+
}
24+
25+
var PermissionClaim *TypePermissionClaim

recipe/userroles/recipe.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
"errors"
2020
"net/http"
2121

22+
"github.com/supertokens/supertokens-golang/recipe/session"
23+
"github.com/supertokens/supertokens-golang/recipe/userroles/claims"
2224
"github.com/supertokens/supertokens-golang/recipe/userroles/userrolesmodels"
2325
"github.com/supertokens/supertokens-golang/supertokens"
2426
)
@@ -66,6 +68,22 @@ func recipeInit(config *userrolesmodels.TypeInput) supertokens.Recipe {
6668
return nil, err
6769
}
6870
singletonInstance = &recipe
71+
72+
supertokens.AddPostInitCallback(func() {
73+
sessionRecipe, err := session.GetRecipeInstanceOrThrowError()
74+
if err != nil {
75+
return
76+
}
77+
78+
if !config.SkipAddingRolesToAccessToken {
79+
sessionRecipe.AddClaimFromOtherRecipe(claims.UserRoleClaim.TypeSessionClaim)
80+
}
81+
82+
if !config.SkipAddingPermissionsToAccessToken {
83+
sessionRecipe.AddClaimFromOtherRecipe(claims.PermissionClaim.TypeSessionClaim)
84+
}
85+
})
86+
6987
return &singletonInstance.RecipeModule, nil
7088
}
7189
return nil, errors.New("User Roles recipe has already been initialised. Please check your code for bugs.")

recipe/userroles/userrolesmodels/models.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@
1616
package userrolesmodels
1717

1818
type TypeInput struct {
19+
SkipAddingRolesToAccessToken bool
20+
SkipAddingPermissionsToAccessToken bool
21+
1922
Override *OverrideStruct
2023
}
2124

2225
type TypeNormalisedInput struct {
26+
SkipAddingRolesToAccessToken bool
27+
SkipAddingPermissionsToAccessToken bool
28+
2329
Override OverrideStruct
2430
}
2531

recipe/userroles/utils.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ func validateAndNormaliseUserInput(appInfo supertokens.NormalisedAppinfo, config
2424

2525
typeNormalisedInput := makeTypeNormalisedInput(appInfo)
2626

27+
if config != nil {
28+
typeNormalisedInput.SkipAddingRolesToAccessToken = config.SkipAddingRolesToAccessToken
29+
typeNormalisedInput.SkipAddingPermissionsToAccessToken = config.SkipAddingPermissionsToAccessToken
30+
}
31+
2732
if config != nil && config.Override != nil {
2833
if config.Override.Functions != nil {
2934
typeNormalisedInput.Override.Functions = config.Override.Functions

0 commit comments

Comments
 (0)