Skip to content

Commit 45aae9c

Browse files
authored
fix: preventing access to login page after Halo setup (#6865)
#### What type of PR is this? /kind bug /area core /milestone 2.20.x #### What this PR does / why we need it: 修复初始化 Halo 之后无法进入登录页面的问题 此问题原因是更改了 AuthProvider 的逻辑,当系统启动之后缺少默认的登录方式导致登录页面无法正确渲染 此 PR 将确保默认的登录方式始终存在来解决此问题 how to test it? 重新初始化 Halo 之后能正确渲染登录页面并登录即为符合预期 #### Does this PR introduce a user-facing change? ```release-note 修复初始化 Halo 之后无法进入登录页面的问题 ```
1 parent dd5f02e commit 45aae9c

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

application/src/main/java/run/halo/app/security/AuthProviderServiceImpl.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import lombok.experimental.Accessors;
1414
import org.apache.commons.lang3.BooleanUtils;
1515
import org.apache.commons.lang3.StringUtils;
16+
import org.springframework.beans.factory.ObjectProvider;
1617
import org.springframework.dao.OptimisticLockingFailureException;
1718
import org.springframework.lang.NonNull;
1819
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
@@ -29,6 +30,7 @@
2930
import run.halo.app.extension.MetadataUtil;
3031
import run.halo.app.extension.ReactiveExtensionClient;
3132
import run.halo.app.extension.index.query.QueryFactory;
33+
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
3234
import run.halo.app.infra.SystemSetting;
3335
import run.halo.app.infra.utils.JsonUtils;
3436

@@ -42,6 +44,7 @@
4244
@RequiredArgsConstructor
4345
public class AuthProviderServiceImpl implements AuthProviderService {
4446
private final ReactiveExtensionClient client;
47+
private final ObjectProvider<SystemConfigurableEnvironmentFetcher> environmentFetcherProvider;
4548

4649
@Override
4750
public Mono<AuthProvider> enable(String name) {
@@ -146,7 +149,7 @@ public int compareTo(@NonNull AuthProviderWithPriority o) {
146149
}
147150

148151
private Mono<List<SystemSetting.AuthProviderState>> fetchProviderStates() {
149-
return fetchSystemConfigMap()
152+
return getSystemConfigMap()
150153
.map(AuthProviderServiceImpl::getAuthProviderConfig)
151154
.map(SystemSetting.AuthProvider::getStates)
152155
.defaultIfEmpty(List.of())
@@ -218,7 +221,7 @@ private static SystemSetting.AuthProvider getAuthProviderConfig(ConfigMap config
218221
}
219222

220223
private Mono<ConfigMap> updateAuthProviderEnabled(String name, boolean enabled) {
221-
return Mono.defer(() -> fetchSystemConfigMap()
224+
return Mono.defer(() -> getSystemConfigMap()
222225
.flatMap(configMap -> {
223226
var providerConfig = getAuthProviderConfig(configMap);
224227
var stateToFoundOpt = providerConfig.getStates()
@@ -244,7 +247,12 @@ private Mono<ConfigMap> updateAuthProviderEnabled(String name, boolean enabled)
244247
.filter(OptimisticLockingFailureException.class::isInstance));
245248
}
246249

247-
Mono<ConfigMap> fetchSystemConfigMap() {
248-
return client.fetch(ConfigMap.class, SystemSetting.SYSTEM_CONFIG);
250+
private Mono<ConfigMap> getSystemConfigMap() {
251+
var systemFetcher = environmentFetcherProvider.getIfUnique();
252+
if (systemFetcher == null) {
253+
return Mono.error(
254+
new IllegalStateException("No SystemConfigurableEnvironmentFetcher found"));
255+
}
256+
return systemFetcher.getConfigMap();
249257
}
250258
}

application/src/main/resources/extensions/system-configurable-configmap.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,11 @@ data:
5151
{
5252
"search-engine": ["search-engine-lucene"]
5353
}
54+
authProvider: |
55+
{
56+
"states": [{
57+
"name": "local",
58+
"enabled": true,
59+
"priority": 0
60+
}]
61+
}

application/src/test/java/run/halo/app/security/AuthProviderServiceImplTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010

1111
import java.util.HashMap;
1212
import org.json.JSONException;
13+
import org.junit.jupiter.api.BeforeEach;
1314
import org.junit.jupiter.api.Test;
1415
import org.junit.jupiter.api.extension.ExtendWith;
1516
import org.mockito.ArgumentCaptor;
1617
import org.mockito.InjectMocks;
1718
import org.mockito.Mock;
1819
import org.skyscreamer.jsonassert.JSONAssert;
20+
import org.springframework.beans.factory.ObjectProvider;
1921
import org.springframework.data.domain.Sort;
2022
import org.springframework.security.test.context.support.WithMockUser;
2123
import org.springframework.test.context.junit.jupiter.SpringExtension;
@@ -28,6 +30,7 @@
2830
import run.halo.app.extension.ListOptions;
2931
import run.halo.app.extension.Metadata;
3032
import run.halo.app.extension.ReactiveExtensionClient;
33+
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
3134
import run.halo.app.infra.SystemSetting;
3235
import run.halo.app.infra.utils.JsonUtils;
3336

@@ -43,9 +46,20 @@ class AuthProviderServiceImplTest {
4346
@Mock
4447
ReactiveExtensionClient client;
4548

49+
@Mock
50+
ObjectProvider<SystemConfigurableEnvironmentFetcher> systemFetchProvider;
51+
52+
@Mock
53+
SystemConfigurableEnvironmentFetcher systemConfigFetcher;
54+
4655
@InjectMocks
4756
AuthProviderServiceImpl authProviderService;
4857

58+
@BeforeEach
59+
void setUp() {
60+
when(systemFetchProvider.getIfUnique()).thenReturn(systemConfigFetcher);
61+
}
62+
4963
@Test
5064
void testEnable() throws JSONException {
5165
// Create a test auth provider
@@ -199,7 +213,7 @@ AuthProvider createAuthProvider(String name) {
199213
void pileSystemConfigMap() {
200214
ConfigMap configMap = new ConfigMap();
201215
configMap.setData(new HashMap<>());
202-
when(client.fetch(eq(ConfigMap.class), eq(SystemSetting.SYSTEM_CONFIG)))
216+
when(systemConfigFetcher.getConfigMap())
203217
.thenReturn(Mono.just(configMap));
204218
}
205219
}

0 commit comments

Comments
 (0)