Skip to content

Commit 0d8a94f

Browse files
authored
Merge pull request #275 from netgrif/NAE-1975
[NAE-1975] NAE nodes gRPC communication
2 parents ea54563 + 285b47b commit 0d8a94f

30 files changed

+277
-155
lines changed

docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: "3.3"
22

33
services:
44
docker-mongo:
5-
image: mongo:7.0.9
5+
image: mongo:8.0.3
66
ports:
77
- "27017:27017"
88
deploy:
@@ -15,7 +15,7 @@ services:
1515
memory: "512M"
1616

1717
docker-elastic:
18-
image: elasticsearch:8.10.4
18+
image: elasticsearch:8.15.3
1919
environment:
2020
- cluster.name=elasticsearch
2121
- discovery.type=single-node
@@ -35,7 +35,7 @@ services:
3535
memory: "512M"
3636

3737
docker-redis:
38-
image: redis:7.2.5
38+
image: redis:7.4.1
3939
ports:
4040
- "6379:6379"
4141
minio:

pom.xml

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
<sonar.organization>netgrif-oss</sonar.organization>
6666
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
6767
<jackson.version>2.17.1</jackson.version>
68+
<jwt.version>0.11.5</jwt.version>
6869
</properties>
6970

7071
<repositories>
@@ -205,17 +206,17 @@
205206
<dependency>
206207
<groupId>io.jsonwebtoken</groupId>
207208
<artifactId>jjwt-api</artifactId>
208-
<version>0.11.5</version>
209+
<version>${jwt.version}</version>
209210
</dependency>
210211
<dependency>
211212
<groupId>io.jsonwebtoken</groupId>
212213
<artifactId>jjwt-impl</artifactId>
213-
<version>0.11.5</version>
214+
<version>${jwt.version}</version>
214215
</dependency>
215216
<dependency>
216217
<groupId>io.jsonwebtoken</groupId>
217218
<artifactId>jjwt-jackson</artifactId>
218-
<version>0.11.5</version>
219+
<version>${jwt.version}</version>
219220
</dependency>
220221

221222
<!-- Session -->
@@ -575,6 +576,24 @@
575576
<filtering>true</filtering>
576577
</resource>
577578
</resources>
579+
<pluginManagement>
580+
<plugins>
581+
<plugin>
582+
<groupId>org.apache.maven.plugins</groupId>
583+
<artifactId>maven-source-plugin</artifactId>
584+
<version>3.3.1</version>
585+
<executions>
586+
<execution>
587+
<id>attach-sources</id>
588+
<goals>
589+
<goal>jar</goal>
590+
</goals>
591+
<phase>install</phase>
592+
</execution>
593+
</executions>
594+
</plugin>
595+
</plugins>
596+
</pluginManagement>
578597
<plugins>
579598
<plugin>
580599
<groupId>org.springframework.boot</groupId>
@@ -618,7 +637,7 @@
618637
<plugin>
619638
<groupId>org.codehaus.gmavenplus</groupId>
620639
<artifactId>gmavenplus-plugin</artifactId>
621-
<version>1.12.1</version>
640+
<version>3.0.2</version>
622641
<executions>
623642
<execution>
624643
<goals>
@@ -661,19 +680,11 @@
661680
</execution>
662681
</executions>
663682
</plugin>
664-
<!-- <plugin>-->
665-
<!-- <groupId>org.apache.maven.plugins</groupId>-->
666-
<!-- <artifactId>maven-source-plugin</artifactId>-->
667-
<!-- <executions>-->
668-
<!-- <execution>-->
669-
<!-- <id>attach-sources</id>-->
670-
<!-- <goals>-->
671-
<!-- <goal>jar-no-fork</goal>-->
672-
<!-- </goals>-->
673-
<!-- <phase>package</phase>-->
674-
<!-- </execution>-->
675-
<!-- </executions>-->
676-
<!-- </plugin>-->
683+
<plugin>
684+
<groupId>org.apache.maven.plugins</groupId>
685+
<artifactId>maven-source-plugin</artifactId>
686+
<version>3.3.1</version>
687+
</plugin>
677688
<plugin>
678689
<groupId>org.apache.maven.plugins</groupId>
679690
<artifactId>maven-javadoc-plugin</artifactId>

src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/Field.groovy

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@ import com.netgrif.application.engine.petrinet.domain.events.DataEventType
1515
import com.querydsl.core.annotations.PropertyType
1616
import com.querydsl.core.annotations.QueryType
1717
import org.bson.types.ObjectId
18+
import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl
1819
import org.springframework.data.annotation.Id
1920
import org.springframework.data.annotation.Transient
2021
import org.springframework.data.mongodb.core.mapping.Document
2122

2223
@Document
23-
abstract class Field<T> extends Imported {
24+
abstract class Field<T> extends Imported implements Serializable {
2425

26+
@Serial
27+
static final long serialVersionUID = 8315043110342747937L
28+
2529
@Id
2630
protected ObjectId _id
2731

@@ -313,7 +317,7 @@ abstract class Field<T> extends Imported {
313317
@Override
314318
@QueryType(PropertyType.NONE)
315319
MetaClass getMetaClass() {
316-
return this.metaClass
320+
return this.metaClass != null ? this.metaClass : ((MetaClassRegistryImpl) GroovySystem.getMetaClassRegistry()).getMetaClass(this)
317321
}
318322

319323
void clone(Field clone) {

src/main/java/com/netgrif/application/engine/auth/service/AbstractUserService.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public void addDefaultRole(IUser user) {
4444
user.addProcessRole(processRoleService.defaultRole());
4545
}
4646

47+
@Override
48+
public void addAnonymousRole(IUser user) {
49+
user.addProcessRole(processRoleService.defaultRole());
50+
}
51+
4752
@Override
4853
public void addDefaultAuthorities(IUser user) {
4954
if (user.getAuthorities().isEmpty()) {
@@ -53,6 +58,15 @@ public void addDefaultAuthorities(IUser user) {
5358
}
5459
}
5560

61+
@Override
62+
public void addAnonymousAuthorities(IUser user) {
63+
if (user.getAuthorities().isEmpty()) {
64+
HashSet<Authority> authorities = new HashSet<>();
65+
authorities.add(authorityService.getOrCreate(Authority.anonymous));
66+
user.setAuthorities(authorities);
67+
}
68+
}
69+
5670
@Override
5771
public IUser assignAuthority(String userId, String authorityId) {
5872
IUser user = resolveById(userId, true);
@@ -92,7 +106,8 @@ public IUser removeRole(IUser user, String roleStringId) {
92106
return removeRole(user, processRoleService.findByImportId(roleStringId));
93107
}
94108

95-
protected IUser removeRole(IUser user, ProcessRole role) {
109+
@Override
110+
public IUser removeRole(IUser user, ProcessRole role) {
96111
user.removeProcessRole(role);
97112
securityContextService.saveToken(user.getStringId());
98113
securityContextService.reloadSecurityContext(user.transformToLoggedUser());

src/main/java/com/netgrif/application/engine/auth/service/interfaces/IUserService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.netgrif.application.engine.auth.domain.LoggedUser;
66
import com.netgrif.application.engine.auth.web.requestbodies.UpdateUserRequest;
77
import com.netgrif.application.engine.petrinet.domain.PetriNet;
8+
import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole;
89
import com.netgrif.application.engine.workflow.domain.ProcessResourceId;
910
import org.bson.types.ObjectId;
1011
import org.springframework.data.domain.Page;
@@ -45,10 +46,12 @@ public interface IUserService {
4546
Page<IUser> findAllActiveByProcessRoles(Set<String> roleIds, boolean small, Pageable pageable);
4647

4748
void addDefaultRole(IUser user);
49+
void addAnonymousRole(IUser user);
4850

4951
List<IUser> findAllByProcessRoles(Set<String> roleIds, boolean small);
5052

5153
void addDefaultAuthorities(IUser user);
54+
void addAnonymousAuthorities(IUser user);
5255

5356
IUser assignAuthority(String userId, String authorityId);
5457

@@ -67,6 +70,7 @@ public interface IUserService {
6770
Page<IUser> searchAllCoMembers(String query, LoggedUser principal, Boolean small, Pageable pageable);
6871

6972
IUser removeRole(IUser user, String roleStringId);
73+
IUser removeRole(IUser user, ProcessRole processRole);
7074

7175
void removeRoleOfDeletedPetriNet(PetriNet net);
7276

src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UpdateUserRequest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.netgrif.application.engine.auth.web.requestbodies;
22

3-
public class UpdateUserRequest {
3+
import java.io.Serial;
4+
import java.io.Serializable;
45

6+
public class UpdateUserRequest implements Serializable {
7+
@Serial
8+
private static final long serialVersionUID = 3681503301565489613L;
59
public String telNumber;
610
public String avatar;
711
public String name;

src/main/java/com/netgrif/application/engine/configuration/NaeSecurityConfiguration.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,11 @@ protected PublicAuthenticationFilter createPublicAuthenticationFilter() throws E
184184
return new PublicAuthenticationFilter(
185185
(ProviderManager) authenticationManager(authenticationManagerBuilder),
186186
new AnonymousAuthenticationProvider(ANONYMOUS_USER),
187-
authority,
188-
this.naeAuthProperties.getServerPatterns(),
189-
this.naeAuthProperties.getAnonymousExceptions(),
190-
this.jwtService,
191-
this.userService
187+
naeAuthProperties.getServerPatterns(),
188+
naeAuthProperties.getAnonymousExceptions(),
189+
jwtService,
190+
userService,
191+
authorityService
192192
);
193193
}
194194

src/main/java/com/netgrif/application/engine/configuration/security/PublicAuthenticationFilter.java

Lines changed: 35 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.netgrif.application.engine.configuration.security;
22

33
import com.netgrif.application.engine.auth.domain.*;
4+
import com.netgrif.application.engine.auth.service.interfaces.IAuthorityService;
45
import com.netgrif.application.engine.auth.service.interfaces.IUserService;
56
import com.netgrif.application.engine.configuration.security.jwt.IJwtService;
6-
import io.jsonwebtoken.ExpiredJwtException;
7+
import jakarta.servlet.FilterChain;
8+
import jakarta.servlet.ServletException;
9+
import jakarta.servlet.http.HttpServletRequest;
10+
import jakarta.servlet.http.HttpServletResponse;
711
import lombok.extern.slf4j.Slf4j;
812
import org.bson.types.ObjectId;
913
import org.springframework.security.authentication.AnonymousAuthenticationProvider;
@@ -15,37 +19,35 @@
1519
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
1620
import org.springframework.web.filter.OncePerRequestFilter;
1721

18-
import jakarta.servlet.FilterChain;
19-
import jakarta.servlet.ServletException;
20-
import jakarta.servlet.http.HttpServletRequest;
21-
import jakarta.servlet.http.HttpServletResponse;
2222
import java.io.IOException;
23-
import java.util.*;
23+
import java.util.Collections;
24+
import java.util.Map;
2425

2526
@Slf4j
2627
public class PublicAuthenticationFilter extends OncePerRequestFilter {
2728

2829
private final static String JWT_HEADER_NAME = "X-Jwt-Token";
2930
private final static String BEARER = "Bearer ";
31+
private final static String USER = "user";
3032
private final ProviderManager authenticationManager;
3133
private final AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource = new WebAuthenticationDetailsSource();
32-
private final Authority anonymousAuthority;
3334
private final String[] anonymousAccessUrls;
3435
private final String[] exceptions;
3536

3637
private final IJwtService jwtService;
3738
private final IUserService userService;
39+
private final IAuthorityService authorityService;
3840

3941
public PublicAuthenticationFilter(ProviderManager authenticationManager, AnonymousAuthenticationProvider provider,
40-
Authority anonymousAuthority, String[] urls, String[] exceptions, IJwtService jwtService,
41-
IUserService userService) {
42+
String[] urls, String[] exceptions, IJwtService jwtService,
43+
IUserService userService, IAuthorityService authorityService) {
4244
this.authenticationManager = authenticationManager;
4345
this.authenticationManager.getProviders().add(provider);
44-
this.anonymousAuthority = anonymousAuthority;
4546
this.anonymousAccessUrls = urls;
4647
this.exceptions = exceptions;
4748
this.jwtService = jwtService;
4849
this.userService = userService;
50+
this.authorityService = authorityService;
4951
}
5052

5153
@Override
@@ -62,64 +64,53 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
6264
private void authenticate(HttpServletRequest request, String jwtToken) {
6365
AnonymousAuthenticationToken authRequest = new AnonymousAuthenticationToken(
6466
UserProperties.ANONYMOUS_AUTH_KEY,
65-
jwtService.getLoggedUser(jwtToken, this.anonymousAuthority),
66-
Collections.singleton(this.anonymousAuthority)
67+
jwtService.getLoggedUser(jwtToken, Authority.anonymous),
68+
Collections.singleton(authorityService.getOrCreate(Authority.anonymous))
6769
);
6870
authRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));
6971
Authentication authResult = this.authenticationManager.authenticate(authRequest);
7072
SecurityContextHolder.getContext().setAuthentication(authResult);
7173
}
7274

7375
private String resolveValidToken(HttpServletRequest request, HttpServletResponse response) {
74-
Map<String, Object> claims = new HashMap<>();
7576
String jwtHeader = request.getHeader(JWT_HEADER_NAME);
76-
String jwtToken;
77+
String jwtToken = null;
7778

7879
if (jwtHeader == null || !jwtHeader.startsWith(BEARER)) {
7980
log.warn("There is no JWT token or token is invalid.");
80-
resolveClaims(claims, request);
81-
jwtToken = jwtService.tokenFrom(claims);
81+
LoggedUser loggedUser = resolveLoggedUser(jwtToken);
82+
jwtToken = jwtService.tokenFrom(Collections.emptyMap(), loggedUser.getUsername(), Map.of(USER, loggedUser));
8283
} else {
8384
jwtToken = jwtHeader.replace(BEARER, "");
8485
}
8586

86-
try {
87-
jwtService.isExpired(jwtToken);
88-
} catch (ExpiredJwtException e) {
89-
claims = e.getClaims();
90-
resolveClaims(claims, request);
91-
jwtToken = jwtService.tokenFrom(claims);
87+
if (jwtService.isTokenExpired(jwtToken)) {
88+
LoggedUser loggedUser = resolveLoggedUser(jwtToken);
89+
jwtToken = jwtService.tokenFrom(Collections.emptyMap(), loggedUser.getUsername(), Map.of(USER, loggedUser));
9290
}
93-
9491
return jwtToken;
9592
}
9693

97-
private void resolveClaims(Map<String, Object> claims, HttpServletRequest request) {
98-
LoggedUser loggedUser = createAnonymousUser(request);
99-
100-
if (claims.containsKey("user")) {
101-
IUser user = userService.findAnonymousByEmail((String) ((LinkedHashMap) claims.get("user")).get("email"), false);
102-
if (user != null)
103-
loggedUser = user.transformToLoggedUser();
94+
private LoggedUser resolveLoggedUser(String existingToken) {
95+
LoggedUser loggedUser;
96+
if (existingToken != null) {
97+
loggedUser = jwtService.getLoggedUser(existingToken, Authority.anonymous);
98+
} else {
99+
loggedUser = createAnonymousUser();
104100
}
105101
loggedUser.eraseCredentials();
106-
claims.put("user", loggedUser);
102+
return loggedUser;
107103
}
108104

109-
private LoggedUser createAnonymousUser(HttpServletRequest request) {
105+
private LoggedUser createAnonymousUser() {
110106
String hash = new ObjectId().toString();
111-
112-
AnonymousUser anonymousUser = (AnonymousUser) this.userService.findAnonymousByEmail(hash + "@nae.com", false);
113-
114-
if (anonymousUser == null) {
115-
anonymousUser = new AnonymousUser(hash + "@anonymous.nae",
116-
"n/a",
117-
"User",
118-
"Anonymous"
119-
);
120-
anonymousUser.setState(UserState.ACTIVE);
121-
userService.saveNewAnonymous(anonymousUser);
122-
}
107+
AnonymousUser anonymousUser = new AnonymousUser(hash + "@anonymous.nae",
108+
"n/a",
109+
"User",
110+
"Anonymous"
111+
);
112+
anonymousUser.setState(UserState.ACTIVE);
113+
anonymousUser = userService.saveNewAnonymous(anonymousUser);
123114
return anonymousUser.transformToLoggedUser();
124115
}
125116

0 commit comments

Comments
 (0)