8
8
import java .net .http .HttpRequest ;
9
9
import java .net .http .HttpResponse .BodyHandlers ;
10
10
import java .security .PublicKey ;
11
+ import java .util .HashSet ;
11
12
import java .util .Set ;
12
13
import java .util .function .Consumer ;
13
14
@@ -52,8 +53,7 @@ public HttpAccessManager(final String host, final String realm) {
52
53
53
54
@ Override
54
55
public void manage (final Handler handler , final Context ctx , final Set <Role > permittedRoles ) throws Exception {
55
- checkAccess (ctx , permittedRoles ,
56
- ((HttpServer ) ctx .attribute (Attribute .JAVALIN_SERVER )).getUserAccessInterceptor ());
56
+ checkAccess (ctx , permittedRoles );
57
57
handler .handle (ctx );
58
58
}
59
59
@@ -101,10 +101,9 @@ private void initPublicKey() {
101
101
}
102
102
}
103
103
104
- private void checkAccess (final Context ctx , final Set <Role > permittedRoles ,
105
- final Consumer <UserDataJson > userAccessInterceptor ) {
104
+ private void checkAccess (final Context ctx , final Set <Role > permittedRoles ) {
106
105
try {
107
- TokenVerifier <AccessToken > tokenVerifier = persistUserInfoInContext (ctx , userAccessInterceptor );
106
+ TokenVerifier <AccessToken > tokenVerifier = persistUserInfoInContext (ctx );
108
107
109
108
if (permittedRoles .isEmpty () || permittedRoles .contains (DefaultRole .OPEN ) && permittedRoles .size () == 1 )
110
109
return ;
@@ -146,8 +145,7 @@ private boolean hasPermittedRole(final Context ctx, final Set<Role> permittedRol
146
145
return false ;
147
146
}
148
147
149
- private TokenVerifier <AccessToken > persistUserInfoInContext (final Context ctx ,
150
- final Consumer <UserDataJson > userAccessInterceptor ) {
148
+ private TokenVerifier <AccessToken > persistUserInfoInContext (final Context ctx ) {
151
149
String authorizationHeader = ctx .header (HttpHeader .AUTHORIZATION .asString ());
152
150
153
151
if (authorizationHeader == null || authorizationHeader .isBlank ())
@@ -171,24 +169,32 @@ private TokenVerifier<AccessToken> persistUserInfoInContext(final Context ctx,
171
169
ctx .attribute (Attribute .USER_EMAIL_VERIFIED , token .getEmailVerified ());
172
170
ctx .attribute (Attribute .USER_REALM_ROLES , token .getRealmAccess ().getRoles ());
173
171
172
+ String tenant = (String ) token .getOtherClaims ().get ("tenant" );
173
+ ctx .attribute (Attribute .USER_CLIENT_ATTRIBUTE_TENANT , tenant );
174
+ ctx .attribute (Attribute .USER_TENANT_SET , createTenantSetFrom (tenant ));
175
+
174
176
Set <String > clientRoles = Set .of ();
175
177
String key = token .getIssuedFor ();
176
178
if (token .getResourceAccess ().containsKey (key ))
177
179
clientRoles = token .getResourceAccess ().get (key ).getRoles ();
178
180
ctx .attribute (Attribute .USER_CLIENT_ROLES , clientRoles );
179
181
180
- userAccessInterceptor .accept (UserDataJson .builder ()
181
- .userName (userName )
182
- .givenName (token .getGivenName ())
183
- .client (token .getIssuedFor ())
184
- .familyName (token .getFamilyName ())
185
- .email (token .getEmail ())
186
- .emailVerified (token .getEmailVerified ())
187
- .realmRoles (token .getRealmAccess ().getRoles ())
188
- .clientRoles (clientRoles )
189
- .isActive (token .isActive ())
190
- .isBearer (token .getType ().equalsIgnoreCase ("bearer" ))
191
- .build ());
182
+ Consumer <UserDataJson > userAccessInterceptor = ((HttpServer ) ctx .attribute (Attribute .JAVALIN_SERVER ))
183
+ .getUserAccessInterceptor ();
184
+ if (userAccessInterceptor != null )
185
+ userAccessInterceptor .accept (UserDataJson .builder ()
186
+ .userName (userName )
187
+ .givenName (token .getGivenName ())
188
+ .client (token .getIssuedFor ())
189
+ .familyName (token .getFamilyName ())
190
+ .email (token .getEmail ())
191
+ .emailVerified (token .getEmailVerified ())
192
+ .realmRoles (token .getRealmAccess ().getRoles ())
193
+ .tenant (tenant )
194
+ .clientRoles (clientRoles )
195
+ .isActive (token .isActive ())
196
+ .isBearer (token .getType ().equalsIgnoreCase ("bearer" ))
197
+ .build ());
192
198
193
199
if (!token .isActive ()) {
194
200
setTokenRejectionReason (ctx , "Token is inactive." );
@@ -211,6 +217,20 @@ private TokenVerifier<AccessToken> persistUserInfoInContext(final Context ctx,
211
217
}
212
218
}
213
219
220
+ private Object createTenantSetFrom (final String tenant ) {
221
+ Set <String > tenantSet = new HashSet <>();
222
+ if (tenant == null || tenant .isBlank ())
223
+ return tenantSet ;
224
+
225
+ String [] tenants = tenant .split ("," );
226
+ for (String t : tenants ) {
227
+ if (t .isBlank ())
228
+ continue ;
229
+ tenantSet .add (t .trim ());
230
+ }
231
+ return tenantSet ;
232
+ }
233
+
214
234
private void setTokenRejectionReason (final Context ctx , final String reason ) {
215
235
ctx .attribute (Attribute .KEYCLOAK_TOKEN_REJECTION_REASON , reason );
216
236
}
0 commit comments