Skip to content

Commit 3d99f43

Browse files
committed
Fixed provectus#4312 the issue where audit was not working
1 parent 53a6553 commit 3d99f43

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

kafka-ui-api/src/main/java/com/provectus/kafka/ui/config/auth/OAuthSecurityConfig.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.Map;
99
import java.util.Optional;
10+
import java.util.stream.Collectors;
1011
import lombok.RequiredArgsConstructor;
1112
import lombok.extern.log4j.Log4j2;
1213
import org.jetbrains.annotations.Nullable;
@@ -20,6 +21,7 @@
2021
import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity;
2122
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
2223
import org.springframework.security.config.web.server.ServerHttpSecurity;
24+
import org.springframework.security.core.GrantedAuthority;
2325
import org.springframework.security.oauth2.client.oidc.userinfo.OidcReactiveOAuth2UserService;
2426
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
2527
import org.springframework.security.oauth2.client.oidc.web.server.logout.OidcClientInitiatedServerLogoutSuccessHandler;
@@ -69,12 +71,14 @@ public ReactiveOAuth2UserService<OidcUserRequest, OidcUser> customOidcUserServic
6971
.flatMap(user -> {
7072
var provider = getProviderByProviderId(request.getClientRegistration().getRegistrationId());
7173
final var extractor = getExtractor(provider, acs);
72-
if (extractor == null) {
73-
return Mono.just(user);
74+
if (extractor != null) {
75+
return extractor.extract(acs, user, Map.of("request", request, "provider", provider))
76+
.map(groups -> new RbacOidcUser(user, groups));
77+
} else {
78+
return Mono.just(new RbacOidcUser(
79+
user,
80+
user.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet())));
7481
}
75-
76-
return extractor.extract(acs, user, Map.of("request", request, "provider", provider))
77-
.map(groups -> new RbacOidcUser(user, groups));
7882
});
7983
}
8084

@@ -85,12 +89,14 @@ public ReactiveOAuth2UserService<OAuth2UserRequest, OAuth2User> customOauth2User
8589
.flatMap(user -> {
8690
var provider = getProviderByProviderId(request.getClientRegistration().getRegistrationId());
8791
final var extractor = getExtractor(provider, acs);
88-
if (extractor == null) {
89-
return Mono.just(user);
92+
if (extractor != null) {
93+
return extractor.extract(acs, user, Map.of("request", request, "provider", provider))
94+
.map(groups -> new RbacOAuth2User(user, groups));
95+
} else {
96+
return Mono.just(new RbacOAuth2User(
97+
user,
98+
user.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet())));
9099
}
91-
92-
return extractor.extract(acs, user, Map.of("request", request, "provider", provider))
93-
.map(groups -> new RbacOAuth2User(user, groups));
94100
});
95101
}
96102

kafka-ui-api/src/main/java/com/provectus/kafka/ui/service/audit/AuditService.java

+15-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.google.common.annotations.VisibleForTesting;
77
import com.provectus.kafka.ui.config.ClustersProperties;
88
import com.provectus.kafka.ui.config.auth.AuthenticatedUser;
9+
import com.provectus.kafka.ui.config.auth.RbacUser;
910
import com.provectus.kafka.ui.model.KafkaCluster;
1011
import com.provectus.kafka.ui.model.rbac.AccessContext;
1112
import com.provectus.kafka.ui.service.AdminClientService;
@@ -196,18 +197,26 @@ private Mono<AuthenticatedUser> extractUser(Signal<?> sig) {
196197
Object key = SecurityContext.class;
197198
if (sig.getContextView().hasKey(key)) {
198199
return sig.getContextView().<Mono<SecurityContext>>get(key)
199-
.map(context -> context.getAuthentication().getPrincipal())
200-
.cast(UserDetails.class)
201-
.map(user -> {
202-
var roles = user.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet());
203-
return new AuthenticatedUser(user.getUsername(), roles);
204-
})
200+
.map(AuditService::createAuthenticatedUser)
205201
.switchIfEmpty(NO_AUTH_USER);
206202
} else {
207203
return NO_AUTH_USER;
208204
}
209205
}
210206

207+
private static AuthenticatedUser createAuthenticatedUser(SecurityContext context) {
208+
var principal = context.getAuthentication().getPrincipal();
209+
if (principal instanceof RbacUser user) {
210+
return new AuthenticatedUser(user.name(), user.groups());
211+
} else if (principal instanceof UserDetails user) {
212+
return new AuthenticatedUser(
213+
user.getUsername(),
214+
user.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet()));
215+
} else {
216+
return null;
217+
}
218+
}
219+
211220
private void sendAuditRecord(AccessContext ctx, AuthenticatedUser user) {
212221
sendAuditRecord(ctx, user, null);
213222
}

0 commit comments

Comments
 (0)