Skip to content

Commit 00a24f0

Browse files
committed
Merge remote-tracking branch 'origin/auth_page_be' into feature/auth_page
2 parents df68c5f + 7b6cf2e commit 00a24f0

File tree

6 files changed

+101
-6
lines changed

6 files changed

+101
-6
lines changed

api/src/main/java/io/kafbat/ui/config/auth/AbstractAuthSecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ protected AbstractAuthSecurityConfig() {
1818
"/login",
1919
"/logout",
2020
"/oauth2/**",
21-
"/static/**"
21+
"/static/**",
22+
"/api/config/authentication"
2223
};
2324

2425
}

api/src/main/java/io/kafbat/ui/controller/ApplicationConfigController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.kafbat.ui.api.ApplicationConfigApi;
77
import io.kafbat.ui.config.ClustersProperties;
88
import io.kafbat.ui.model.ActionDTO;
9+
import io.kafbat.ui.model.AppAuthenticationSettingsDTO;
910
import io.kafbat.ui.model.ApplicationConfigDTO;
1011
import io.kafbat.ui.model.ApplicationConfigPropertiesDTO;
1112
import io.kafbat.ui.model.ApplicationConfigValidationDTO;
@@ -66,6 +67,13 @@ public Mono<ResponseEntity<ApplicationInfoDTO>> getApplicationInfo(ServerWebExch
6667
return Mono.just(applicationInfoService.getApplicationInfo()).map(ResponseEntity::ok);
6768
}
6869

70+
@Override
71+
public Mono<ResponseEntity<AppAuthenticationSettingsDTO>> getAuthenticationSettings(
72+
ServerWebExchange exchange) {
73+
return Mono.just(applicationInfoService.getAuthenticationProperties())
74+
.map(ResponseEntity::ok);
75+
}
76+
6977
@Override
7078
public Mono<ResponseEntity<ApplicationConfigDTO>> getCurrentConfig(ServerWebExchange exchange) {
7179
var context = AccessContext.builder()
@@ -109,7 +117,7 @@ public Mono<ResponseEntity<UploadedFileInfoDTO>> uploadConfigRelatedFile(Flux<Pa
109117
.then(fileFlux.single())
110118
.flatMap(file ->
111119
dynamicConfigOperations.uploadConfigRelatedFile((FilePart) file)
112-
.map(path -> new UploadedFileInfoDTO().location(path.toString()))
120+
.map(path -> new UploadedFileInfoDTO(path.toString()))
113121
.map(ResponseEntity::ok))
114122
.doOnEach(sig -> audit(context, sig));
115123
}

api/src/main/java/io/kafbat/ui/controller/AuthController.java renamed to api/src/main/java/io/kafbat/ui/controller/AuthenticationController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
@RestController
1414
@RequiredArgsConstructor
1515
@Slf4j
16-
public class AuthController {
16+
public class AuthenticationController {
1717

1818
@GetMapping(value = "/auth", produces = {"text/html"})
1919
public Mono<byte[]> getAuth(ServerWebExchange exchange) {
2020
Mono<CsrfToken> token = exchange.getAttributeOrDefault(CsrfToken.class.getName(), Mono.empty());
2121
return token
22-
.map(AuthController::csrfToken)
22+
.map(AuthenticationController::csrfToken)
2323
.defaultIfEmpty("")
2424
.map(csrfTokenHtmlInput -> createPage(exchange, csrfTokenHtmlInput));
2525
}

api/src/main/java/io/kafbat/ui/controller/AccessController.java renamed to api/src/main/java/io/kafbat/ui/controller/AuthorizationController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
@RestController
2727
@RequiredArgsConstructor
2828
@Slf4j
29-
public class AccessController implements AuthorizationApi {
29+
public class AuthorizationController implements AuthorizationApi {
3030

3131
private final AccessControlService accessControlService;
3232

api/src/main/java/io/kafbat/ui/service/ApplicationInfoService.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,51 @@
11
package io.kafbat.ui.service;
22

3+
import static io.kafbat.ui.api.model.AuthType.DISABLED;
4+
import static io.kafbat.ui.api.model.AuthType.OAUTH2;
35
import static io.kafbat.ui.model.ApplicationInfoDTO.EnabledFeaturesEnum;
46
import static io.kafbat.ui.util.GithubReleaseInfo.GITHUB_RELEASE_INFO_TIMEOUT;
57

68
import com.google.common.annotations.VisibleForTesting;
9+
import com.google.common.collect.Streams;
10+
import io.kafbat.ui.model.AppAuthenticationSettingsDTO;
711
import io.kafbat.ui.model.ApplicationInfoBuildDTO;
812
import io.kafbat.ui.model.ApplicationInfoDTO;
913
import io.kafbat.ui.model.ApplicationInfoLatestReleaseDTO;
14+
import io.kafbat.ui.model.AuthTypeDTO;
15+
import io.kafbat.ui.model.OAuthProviderDTO;
1016
import io.kafbat.ui.util.DynamicConfigOperations;
1117
import io.kafbat.ui.util.GithubReleaseInfo;
1218
import java.time.format.DateTimeFormatter;
1319
import java.util.ArrayList;
20+
import java.util.Collections;
1421
import java.util.List;
1522
import java.util.Optional;
1623
import java.util.Properties;
1724
import org.springframework.beans.factory.annotation.Autowired;
1825
import org.springframework.beans.factory.annotation.Value;
1926
import org.springframework.boot.info.BuildProperties;
2027
import org.springframework.boot.info.GitProperties;
28+
import org.springframework.context.ApplicationContext;
29+
import org.springframework.core.ResolvableType;
2130
import org.springframework.scheduling.annotation.Scheduled;
31+
import org.springframework.security.oauth2.client.registration.ClientRegistration;
32+
import org.springframework.security.oauth2.core.AuthorizationGrantType;
2233
import org.springframework.stereotype.Service;
2334

2435
@Service
2536
public class ApplicationInfoService {
2637
private final GithubReleaseInfo githubReleaseInfo;
38+
private final ApplicationContext applicationContext;
2739
private final DynamicConfigOperations dynamicConfigOperations;
2840
private final BuildProperties buildProperties;
2941
private final GitProperties gitProperties;
3042

3143
public ApplicationInfoService(DynamicConfigOperations dynamicConfigOperations,
44+
ApplicationContext applicationContext,
3245
@Autowired(required = false) BuildProperties buildProperties,
3346
@Autowired(required = false) GitProperties gitProperties,
3447
@Value("${" + GITHUB_RELEASE_INFO_TIMEOUT + ":10}") int githubApiMaxWaitTime) {
48+
this.applicationContext = applicationContext;
3549
this.dynamicConfigOperations = dynamicConfigOperations;
3650
this.buildProperties = Optional.ofNullable(buildProperties).orElse(new BuildProperties(new Properties()));
3751
this.gitProperties = Optional.ofNullable(gitProperties).orElse(new GitProperties(new Properties()));
@@ -70,6 +84,38 @@ private List<EnabledFeaturesEnum> getEnabledFeatures() {
7084
return enabledFeatures;
7185
}
7286

87+
public AppAuthenticationSettingsDTO getAuthenticationProperties() {
88+
return new AppAuthenticationSettingsDTO()
89+
.authType(AuthTypeDTO.fromValue(getAuthType()))
90+
.oAuthProviders(getOAuthProviders());
91+
}
92+
93+
private String getAuthType() {
94+
return Optional.ofNullable(applicationContext.getEnvironment().getProperty("auth.type"))
95+
.orElse(DISABLED.getValue());
96+
}
97+
98+
@SuppressWarnings("unchecked")
99+
private List<OAuthProviderDTO> getOAuthProviders() {
100+
if (!getAuthType().equalsIgnoreCase(OAUTH2.getValue())) {
101+
return Collections.emptyList();
102+
}
103+
var type = ResolvableType.forClassWithGenerics(Iterable.class, ClientRegistration.class);
104+
String[] names = this.applicationContext.getBeanNamesForType(type);
105+
var bean = (Iterable<ClientRegistration>) (names.length == 1 ? this.applicationContext.getBean(names[0]) : null);
106+
107+
if (bean == null) {
108+
return Collections.emptyList();
109+
}
110+
111+
return Streams.stream(bean.iterator())
112+
.filter(r -> AuthorizationGrantType.AUTHORIZATION_CODE.equals(r.getAuthorizationGrantType()))
113+
.map(r -> new OAuthProviderDTO()
114+
.clientName(r.getClientName())
115+
.authorizationUri("/oauth2/authorization/" + r.getRegistrationId()))
116+
.toList();
117+
}
118+
73119
// updating on startup and every hour
74120
@Scheduled(fixedRateString = "${github-release-info-update-rate:3600000}")
75121
public void updateGithubReleaseInfo() {

contract/src/main/resources/swagger/kafbat-ui-api.yaml

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2150,7 +2150,7 @@ paths:
21502150
get:
21512151
tags:
21522152
- Authorization
2153-
summary: Get user authentication related info
2153+
summary: Get user authorization related info
21542154
operationId: getUserAuthInfo
21552155
responses:
21562156
200:
@@ -2244,6 +2244,20 @@ paths:
22442244
schema:
22452245
$ref: '#/components/schemas/UploadedFileInfo'
22462246

2247+
/api/config/authentication:
2248+
get:
2249+
tags:
2250+
- ApplicationConfig
2251+
summary: Get authentication methods enabled for the app and other related settings
2252+
operationId: getAuthenticationSettings
2253+
responses:
2254+
200:
2255+
description: OK
2256+
content:
2257+
application/json:
2258+
schema:
2259+
$ref: '#/components/schemas/AppAuthenticationSettings'
2260+
22472261
components:
22482262
schemas:
22492263
TopicSerdeSuggestion:
@@ -2354,6 +2368,32 @@ components:
23542368
htmlUrl:
23552369
type: string
23562370

2371+
AppAuthenticationSettings:
2372+
type: object
2373+
properties:
2374+
authType:
2375+
$ref: '#/components/schemas/AuthType'
2376+
oAuthProviders:
2377+
type: array
2378+
items:
2379+
$ref: '#/components/schemas/OAuthProvider'
2380+
2381+
OAuthProvider:
2382+
type: object
2383+
properties:
2384+
clientName:
2385+
type: string
2386+
authorizationUri:
2387+
type: string
2388+
2389+
AuthType:
2390+
type: string
2391+
enum:
2392+
- DISABLED
2393+
- OAUTH2
2394+
- LOGIN_FORM
2395+
- LDAP
2396+
23572397
Cluster:
23582398
type: object
23592399
properties:

0 commit comments

Comments
 (0)