Skip to content

Commit 3a427c3

Browse files
author
Gerald Unterrainer
committedMay 10, 2021
Merge branch 'develop'
2 parents 4daad8d + 7919531 commit 3a427c3

15 files changed

+696
-551
lines changed
 

‎pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
<modelVersion>4.0.0</modelVersion>
1919
<artifactId>http-server</artifactId>
20-
<version>0.2.6</version>
20+
<version>0.2.7</version>
2121
<name>HttpServer</name>
2222
<packaging>jar</packaging>
2323

‎src/main/java/info/unterrainer/commons/httpserver/GenericHandlerGroup.java

+5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public class GenericHandlerGroup<P extends BasicJpa, J extends BasicJson, E> imp
4646
private final LinkedHashMap<Endpoint, Role[]> accessRoles;
4747
private final ExecutorService executorService;
4848
private final HandlerUtils hu = new HandlerUtils();
49+
private final String tenantIdRowName;
50+
private final BasicDao<? extends BasicJpa, E> tenantDao;
51+
private final Class<? extends BasicJpa> tenantJpaType;
52+
private final String fieldRowName;
53+
private final String tenantRowName;
4954

5055
@Override
5156
public void addHandlers(final HttpServer server) {

‎src/main/java/info/unterrainer/commons/httpserver/GenericHandlerGroupBuilder.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ public class GenericHandlerGroupBuilder<P extends BasicJpa, J extends BasicJson,
3939
private List<GetListInterceptor> getListInterceptors = new ArrayList<>();
4040
private ExecutorService executorService;
4141

42+
private String tenantIdRowName;
43+
private String tenantRowName;
44+
private String tenantFieldRowName;
45+
private BasicDao<? extends BasicJpa, E> tenantDao;
46+
private Class<? extends BasicJpa> tenantJpaType;
47+
4248
HandlerExtensions<P, J, E> extensions = new HandlerExtensions<>();
4349
private LinkedHashMap<Endpoint, Role[]> accessRoles = new LinkedHashMap<>();
4450

@@ -51,7 +57,8 @@ public HttpServer add() {
5157
executorService = server.executorService;
5258
GenericHandlerGroup<P, J, E> handlerGroupInstance = new GenericHandlerGroup<>(dao, jpaType, jsonType,
5359
daoTransactionManager, jsonMapper, orikaFactory.getMapperFacade(), path, endpoints, getListInterceptors,
54-
extensions, accessRoles, executorService);
60+
extensions, accessRoles, executorService, tenantIdRowName, tenantDao, tenantJpaType, tenantFieldRowName,
61+
tenantRowName);
5562
server.addHandlerGroup(handlerGroupInstance);
5663
return server;
5764
}
@@ -65,6 +72,21 @@ public GenericHandlerGroupBuilder<P, J, E> addRoleFor(final Endpoint endpoint, f
6572
return this;
6673
}
6774

75+
public GenericHandlerGroupBuilder<P, J, E> isMultiTenantEnabledByIdRow(final String tenantIdRowName) {
76+
this.tenantIdRowName = tenantIdRowName;
77+
return this;
78+
}
79+
80+
public <TP extends BasicJpa> GenericHandlerGroupBuilder<P, J, E> isMultiTenantEnabledByTable(
81+
final BasicDao<TP, E> tenantDao, final Class<TP> tenantJpaType, final String fieldRowName,
82+
final String tenantRowName) {
83+
this.tenantDao = tenantDao;
84+
this.tenantJpaType = tenantJpaType;
85+
this.tenantFieldRowName = fieldRowName;
86+
this.tenantRowName = tenantRowName;
87+
return this;
88+
}
89+
6890
public GenericHandlerGroupBuilder<P, J, E> dao(final BasicDao<P, E> dao) {
6991
this.dao = dao;
7092
return this;

‎src/main/java/info/unterrainer/commons/httpserver/accessmanager/HttpAccessManager.java

+39-19
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.net.http.HttpRequest;
99
import java.net.http.HttpResponse.BodyHandlers;
1010
import java.security.PublicKey;
11+
import java.util.HashSet;
1112
import java.util.Set;
1213
import java.util.function.Consumer;
1314

@@ -52,8 +53,7 @@ public HttpAccessManager(final String host, final String realm) {
5253

5354
@Override
5455
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);
5757
handler.handle(ctx);
5858
}
5959

@@ -101,10 +101,9 @@ private void initPublicKey() {
101101
}
102102
}
103103

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) {
106105
try {
107-
TokenVerifier<AccessToken> tokenVerifier = persistUserInfoInContext(ctx, userAccessInterceptor);
106+
TokenVerifier<AccessToken> tokenVerifier = persistUserInfoInContext(ctx);
108107

109108
if (permittedRoles.isEmpty() || permittedRoles.contains(DefaultRole.OPEN) && permittedRoles.size() == 1)
110109
return;
@@ -146,8 +145,7 @@ private boolean hasPermittedRole(final Context ctx, final Set<Role> permittedRol
146145
return false;
147146
}
148147

149-
private TokenVerifier<AccessToken> persistUserInfoInContext(final Context ctx,
150-
final Consumer<UserDataJson> userAccessInterceptor) {
148+
private TokenVerifier<AccessToken> persistUserInfoInContext(final Context ctx) {
151149
String authorizationHeader = ctx.header(HttpHeader.AUTHORIZATION.asString());
152150

153151
if (authorizationHeader == null || authorizationHeader.isBlank())
@@ -171,24 +169,32 @@ private TokenVerifier<AccessToken> persistUserInfoInContext(final Context ctx,
171169
ctx.attribute(Attribute.USER_EMAIL_VERIFIED, token.getEmailVerified());
172170
ctx.attribute(Attribute.USER_REALM_ROLES, token.getRealmAccess().getRoles());
173171

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+
174176
Set<String> clientRoles = Set.of();
175177
String key = token.getIssuedFor();
176178
if (token.getResourceAccess().containsKey(key))
177179
clientRoles = token.getResourceAccess().get(key).getRoles();
178180
ctx.attribute(Attribute.USER_CLIENT_ROLES, clientRoles);
179181

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());
192198

193199
if (!token.isActive()) {
194200
setTokenRejectionReason(ctx, "Token is inactive.");
@@ -211,6 +217,20 @@ private TokenVerifier<AccessToken> persistUserInfoInContext(final Context ctx,
211217
}
212218
}
213219

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+
214234
private void setTokenRejectionReason(final Context ctx, final String reason) {
215235
ctx.attribute(Attribute.KEYCLOAK_TOKEN_REJECTION_REASON, reason);
216236
}

‎src/main/java/info/unterrainer/commons/httpserver/daos/BasicAsyncDao.java

-42
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,40 @@
11
package info.unterrainer.commons.httpserver.daos;
22

3-
import javax.persistence.TypedQuery;
4-
53
import info.unterrainer.commons.httpserver.jsons.ListJson;
64
import info.unterrainer.commons.rdbutils.entities.BasicJpa;
75

86
public interface BasicDao<P extends BasicJpa, E> {
97

108
P getById(Long id);
119

12-
ListJson<P> getList(long offset, long size);
13-
14-
ListJson<P> getList(long offset, long size, String whereClause, ParamMap params);
15-
1610
P create(P entity);
1711

1812
P update(P entity);
1913

14+
ListJson<P> getList(E em, long offset, long size, String selectClause, String joinClause, String whereClause,
15+
ParamMap params, String orderByClause);
16+
2017
UpsertResult<P> upsert(String whereClause, ParamMap params, P entity);
2118

22-
UpsertResult<P> upsert(TypedQuery<P> query, P entity);
19+
UpsertResult<P> upsert(Query<P, P> query, P entity);
2320

2421
void delete(Long id);
2522

2623
P getById(E em, Long id);
2724

28-
ListJson<P> getList(E em, long offset, long size);
25+
<T> QueryBuilder<P, T> query(Class<T> resultType);
2926

30-
ListJson<P> getList(E em, long offset, long size, String whereClause, ParamMap params);
27+
QueryBuilder<P, P> query();
3128

32-
ListJson<P> getList(E em, long offset, long size, String joinClause, String whereClause, ParamMap params);
33-
34-
ListJson<P> getList(E em, long offset, long size, String selectClause, String joinClause, String whereClause,
35-
ParamMap params);
36-
37-
ListJson<P> getList(E em, long offset, long size, String selectClause, String joinClause, String whereClause,
38-
ParamMap params, String orderByClause);
29+
CountQueryBuilder<P> countQuery();
3930

4031
P create(E em, P entity);
4132

4233
P update(E em, P entity);
4334

4435
UpsertResult<P> upsert(E em, String whereClause, ParamMap params, P entity);
4536

46-
UpsertResult<P> upsert(E em, TypedQuery<P> query, P entity);
37+
UpsertResult<P> upsert(E em, Query<P, P> query, P entity);
4738

4839
void delete(E em, Long id);
4940
}

0 commit comments

Comments
 (0)
Please sign in to comment.