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 之后无法进入登录页面的问题
```
pull/6866/head v2.20.2
guqing 2024-10-14 20:43:18 +08:00 committed by GitHub
parent dd5f02e505
commit 45aae9c1a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 35 additions and 5 deletions

View File

@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.lang.NonNull; import org.springframework.lang.NonNull;
import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.security.core.context.ReactiveSecurityContextHolder;
@ -29,6 +30,7 @@ import run.halo.app.extension.ListOptions;
import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.MetadataUtil;
import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.extension.index.query.QueryFactory; import run.halo.app.extension.index.query.QueryFactory;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemSetting; import run.halo.app.infra.SystemSetting;
import run.halo.app.infra.utils.JsonUtils; import run.halo.app.infra.utils.JsonUtils;
@ -42,6 +44,7 @@ import run.halo.app.infra.utils.JsonUtils;
@RequiredArgsConstructor @RequiredArgsConstructor
public class AuthProviderServiceImpl implements AuthProviderService { public class AuthProviderServiceImpl implements AuthProviderService {
private final ReactiveExtensionClient client; private final ReactiveExtensionClient client;
private final ObjectProvider<SystemConfigurableEnvironmentFetcher> environmentFetcherProvider;
@Override @Override
public Mono<AuthProvider> enable(String name) { public Mono<AuthProvider> enable(String name) {
@ -146,7 +149,7 @@ public class AuthProviderServiceImpl implements AuthProviderService {
} }
private Mono<List<SystemSetting.AuthProviderState>> fetchProviderStates() { private Mono<List<SystemSetting.AuthProviderState>> fetchProviderStates() {
return fetchSystemConfigMap() return getSystemConfigMap()
.map(AuthProviderServiceImpl::getAuthProviderConfig) .map(AuthProviderServiceImpl::getAuthProviderConfig)
.map(SystemSetting.AuthProvider::getStates) .map(SystemSetting.AuthProvider::getStates)
.defaultIfEmpty(List.of()) .defaultIfEmpty(List.of())
@ -218,7 +221,7 @@ public class AuthProviderServiceImpl implements AuthProviderService {
} }
private Mono<ConfigMap> updateAuthProviderEnabled(String name, boolean enabled) { private Mono<ConfigMap> updateAuthProviderEnabled(String name, boolean enabled) {
return Mono.defer(() -> fetchSystemConfigMap() return Mono.defer(() -> getSystemConfigMap()
.flatMap(configMap -> { .flatMap(configMap -> {
var providerConfig = getAuthProviderConfig(configMap); var providerConfig = getAuthProviderConfig(configMap);
var stateToFoundOpt = providerConfig.getStates() var stateToFoundOpt = providerConfig.getStates()
@ -244,7 +247,12 @@ public class AuthProviderServiceImpl implements AuthProviderService {
.filter(OptimisticLockingFailureException.class::isInstance)); .filter(OptimisticLockingFailureException.class::isInstance));
} }
Mono<ConfigMap> fetchSystemConfigMap() { private Mono<ConfigMap> getSystemConfigMap() {
return client.fetch(ConfigMap.class, SystemSetting.SYSTEM_CONFIG); var systemFetcher = environmentFetcherProvider.getIfUnique();
if (systemFetcher == null) {
return Mono.error(
new IllegalStateException("No SystemConfigurableEnvironmentFetcher found"));
}
return systemFetcher.getConfigMap();
} }
} }

View File

@ -51,3 +51,11 @@ data:
{ {
"search-engine": ["search-engine-lucene"] "search-engine": ["search-engine-lucene"]
} }
authProvider: |
{
"states": [{
"name": "local",
"enabled": true,
"priority": 0
}]
}

View File

@ -10,12 +10,14 @@ import static org.mockito.Mockito.when;
import java.util.HashMap; import java.util.HashMap;
import org.json.JSONException; import org.json.JSONException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.skyscreamer.jsonassert.JSONAssert; import org.skyscreamer.jsonassert.JSONAssert;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.security.test.context.support.WithMockUser; import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit.jupiter.SpringExtension;
@ -28,6 +30,7 @@ import run.halo.app.extension.ConfigMap;
import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListOptions;
import run.halo.app.extension.Metadata; import run.halo.app.extension.Metadata;
import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemSetting; import run.halo.app.infra.SystemSetting;
import run.halo.app.infra.utils.JsonUtils; import run.halo.app.infra.utils.JsonUtils;
@ -43,9 +46,20 @@ class AuthProviderServiceImplTest {
@Mock @Mock
ReactiveExtensionClient client; ReactiveExtensionClient client;
@Mock
ObjectProvider<SystemConfigurableEnvironmentFetcher> systemFetchProvider;
@Mock
SystemConfigurableEnvironmentFetcher systemConfigFetcher;
@InjectMocks @InjectMocks
AuthProviderServiceImpl authProviderService; AuthProviderServiceImpl authProviderService;
@BeforeEach
void setUp() {
when(systemFetchProvider.getIfUnique()).thenReturn(systemConfigFetcher);
}
@Test @Test
void testEnable() throws JSONException { void testEnable() throws JSONException {
// Create a test auth provider // Create a test auth provider
@ -199,7 +213,7 @@ class AuthProviderServiceImplTest {
void pileSystemConfigMap() { void pileSystemConfigMap() {
ConfigMap configMap = new ConfigMap(); ConfigMap configMap = new ConfigMap();
configMap.setData(new HashMap<>()); configMap.setData(new HashMap<>());
when(client.fetch(eq(ConfigMap.class), eq(SystemSetting.SYSTEM_CONFIG))) when(systemConfigFetcher.getConfigMap())
.thenReturn(Mono.just(configMap)); .thenReturn(Mono.just(configMap));
} }
} }