mirror of https://github.com/halo-dev/halo
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
parent
dd5f02e505
commit
45aae9c1a8
|
@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor;
|
|||
import lombok.experimental.Accessors;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.dao.OptimisticLockingFailureException;
|
||||
import org.springframework.lang.NonNull;
|
||||
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.ReactiveExtensionClient;
|
||||
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.utils.JsonUtils;
|
||||
|
||||
|
@ -42,6 +44,7 @@ import run.halo.app.infra.utils.JsonUtils;
|
|||
@RequiredArgsConstructor
|
||||
public class AuthProviderServiceImpl implements AuthProviderService {
|
||||
private final ReactiveExtensionClient client;
|
||||
private final ObjectProvider<SystemConfigurableEnvironmentFetcher> environmentFetcherProvider;
|
||||
|
||||
@Override
|
||||
public Mono<AuthProvider> enable(String name) {
|
||||
|
@ -146,7 +149,7 @@ public class AuthProviderServiceImpl implements AuthProviderService {
|
|||
}
|
||||
|
||||
private Mono<List<SystemSetting.AuthProviderState>> fetchProviderStates() {
|
||||
return fetchSystemConfigMap()
|
||||
return getSystemConfigMap()
|
||||
.map(AuthProviderServiceImpl::getAuthProviderConfig)
|
||||
.map(SystemSetting.AuthProvider::getStates)
|
||||
.defaultIfEmpty(List.of())
|
||||
|
@ -218,7 +221,7 @@ public class AuthProviderServiceImpl implements AuthProviderService {
|
|||
}
|
||||
|
||||
private Mono<ConfigMap> updateAuthProviderEnabled(String name, boolean enabled) {
|
||||
return Mono.defer(() -> fetchSystemConfigMap()
|
||||
return Mono.defer(() -> getSystemConfigMap()
|
||||
.flatMap(configMap -> {
|
||||
var providerConfig = getAuthProviderConfig(configMap);
|
||||
var stateToFoundOpt = providerConfig.getStates()
|
||||
|
@ -244,7 +247,12 @@ public class AuthProviderServiceImpl implements AuthProviderService {
|
|||
.filter(OptimisticLockingFailureException.class::isInstance));
|
||||
}
|
||||
|
||||
Mono<ConfigMap> fetchSystemConfigMap() {
|
||||
return client.fetch(ConfigMap.class, SystemSetting.SYSTEM_CONFIG);
|
||||
private Mono<ConfigMap> getSystemConfigMap() {
|
||||
var systemFetcher = environmentFetcherProvider.getIfUnique();
|
||||
if (systemFetcher == null) {
|
||||
return Mono.error(
|
||||
new IllegalStateException("No SystemConfigurableEnvironmentFetcher found"));
|
||||
}
|
||||
return systemFetcher.getConfigMap();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,3 +51,11 @@ data:
|
|||
{
|
||||
"search-engine": ["search-engine-lucene"]
|
||||
}
|
||||
authProvider: |
|
||||
{
|
||||
"states": [{
|
||||
"name": "local",
|
||||
"enabled": true,
|
||||
"priority": 0
|
||||
}]
|
||||
}
|
||||
|
|
|
@ -10,12 +10,14 @@ import static org.mockito.Mockito.when;
|
|||
|
||||
import java.util.HashMap;
|
||||
import org.json.JSONException;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.skyscreamer.jsonassert.JSONAssert;
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.security.test.context.support.WithMockUser;
|
||||
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.Metadata;
|
||||
import run.halo.app.extension.ReactiveExtensionClient;
|
||||
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
|
||||
import run.halo.app.infra.SystemSetting;
|
||||
import run.halo.app.infra.utils.JsonUtils;
|
||||
|
||||
|
@ -43,9 +46,20 @@ class AuthProviderServiceImplTest {
|
|||
@Mock
|
||||
ReactiveExtensionClient client;
|
||||
|
||||
@Mock
|
||||
ObjectProvider<SystemConfigurableEnvironmentFetcher> systemFetchProvider;
|
||||
|
||||
@Mock
|
||||
SystemConfigurableEnvironmentFetcher systemConfigFetcher;
|
||||
|
||||
@InjectMocks
|
||||
AuthProviderServiceImpl authProviderService;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
when(systemFetchProvider.getIfUnique()).thenReturn(systemConfigFetcher);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testEnable() throws JSONException {
|
||||
// Create a test auth provider
|
||||
|
@ -199,7 +213,7 @@ class AuthProviderServiceImplTest {
|
|||
void pileSystemConfigMap() {
|
||||
ConfigMap configMap = new ConfigMap();
|
||||
configMap.setData(new HashMap<>());
|
||||
when(client.fetch(eq(ConfigMap.class), eq(SystemSetting.SYSTEM_CONFIG)))
|
||||
when(systemConfigFetcher.getConfigMap())
|
||||
.thenReturn(Mono.just(configMap));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue