diff --git a/client/packages/lowcoder-sdk/dataSource.d.ts b/client/packages/lowcoder-sdk/dataSource.d.ts index 797698767..2d9c4f980 100644 --- a/client/packages/lowcoder-sdk/dataSource.d.ts +++ b/client/packages/lowcoder-sdk/dataSource.d.ts @@ -319,6 +319,18 @@ export interface DataSourcePluginMeta extends DataSourcePluginBasicInfo { DataSourceConfig, { extra?: DynamicConfigObject; + authConfig?: { + type: AuthType; + authId?: string; + } & ( + | { + username: string; // basic auth + password: string; + } + | OAuthConfig + ); + + sslConfig?: SSLConfig; } >; queryConfig: DynamicConfigObject | QueryConfig; diff --git a/client/packages/lowcoder/src/pages/datasource/form/httpDatasourceForm.tsx b/client/packages/lowcoder/src/pages/datasource/form/httpDatasourceForm.tsx index 7c4b13a0e..150ce84de 100644 --- a/client/packages/lowcoder/src/pages/datasource/form/httpDatasourceForm.tsx +++ b/client/packages/lowcoder/src/pages/datasource/form/httpDatasourceForm.tsx @@ -24,7 +24,7 @@ import { useHostCheck } from "./useHostCheck"; import { useSelector } from "react-redux"; import { getUser } from "redux/selectors/usersSelectors"; -const AuthTypeOptions = [ +export const AuthTypeOptions = [ { label: "None", value: "NO_AUTH" }, { label: "Basic", value: "BASIC_AUTH" }, { label: "Digest", value: "DIGEST_AUTH" }, diff --git a/client/packages/lowcoder/src/pages/datasource/form/pluginDataSourceForm.tsx b/client/packages/lowcoder/src/pages/datasource/form/pluginDataSourceForm.tsx index 3ed9c974a..c511bfd1c 100644 --- a/client/packages/lowcoder/src/pages/datasource/form/pluginDataSourceForm.tsx +++ b/client/packages/lowcoder/src/pages/datasource/form/pluginDataSourceForm.tsx @@ -22,7 +22,7 @@ import { TacoMarkDown, } from "lowcoder-design"; import { DatasourceFormProps } from "./datasourceFormRegistry"; -import { DatasourceNameFormInputItem, GeneralSettingFormSectionLabel } from "../form"; +import { AdvancedSettingFormSectionLabel, CertValidationFormItem, DatasourceNameFormInputItem, ForwardCookiesFormItem, GeneralSettingFormSectionLabel, encryptedPlaceholder } from "../form"; import { DataSourceParamConfig, ParamOption, @@ -38,6 +38,9 @@ import { FieldData } from "rc-field-form/es/interface"; import { default as Alert } from "antd/es/alert"; import { default as Form } from "antd/es/form"; import { default as Input } from "antd/es/input"; +import { AuthType, AuthTypeOptions } from "./httpDatasourceForm"; +import { useSelector } from "react-redux"; +import { getUser } from "@lowcoder-ee/redux/selectors/usersSelectors"; const TooltipWrapper = styled.div` .markdown-body { @@ -130,14 +133,24 @@ export const PluginDataSourceForm = (props: DatasourceFormProps) => { const [extraParamConfigs, setExtraParamConfigs] = useState([]); const [isExtraParamsRefreshing, setExtraParamRefreshing] = useState(false); const [isExtraParamsRefreshError, setExtraParamRefreshError] = useState(false); + const pluginDef = dataSourceTypeInfo?.definition || datasource.pluginDefinition; const pluginName = dataSourceTypeInfo?.id || datasource.pluginDefinition?.id; const isEditing = !!datasource; const hasDynamicConfig = !!pluginDef?.dataSourceConfig?.extra; + + const [authType, setAuthType] = useState(pluginDef?.dataSourceConfig?.authConfig?.type); + const [authId, setAuthId] = useState(pluginDef?.dataSourceConfig?.authConfig?.authId); const readyStatusCallbackRef = useRef(onFormReadyStatusChange); readyStatusCallbackRef.current = onFormReadyStatusChange; + const userAuthSources = useSelector(getUser).connections?.filter(authSource => authSource.source !== "EMAIL");; + const userAuthSourcesOptions = userAuthSources?.map(item => ({ + label: item.source, + value: item.authId + })) || []; + const handleRefreshExtraParams = useCallback(() => { if (!pluginName) { return; @@ -205,6 +218,65 @@ export const PluginDataSourceForm = (props: DatasourceFormProps) => { const initialValues = getDefaultValues(pluginDef, datasource); const hasGeneralSettings = dataSourceConfig.params?.[0]?.type !== "groupTitle"; + const UsernameFormItem = ( + + ); + + const PasswordFormItem = ( + + ); + + const showAuthItem = (type: AuthType) => { + switch (type) { + case "BASIC_AUTH": + return ( + <> + {UsernameFormItem} + {PasswordFormItem} + + ); + case "DIGEST_AUTH": + return ( + <> + {UsernameFormItem} + {PasswordFormItem} + + ); + } + }; + + const showUserAuthSourceSelector = () => { + if (authType === "OAUTH2_INHERIT_FROM_LOGIN") { + return ( + setAuthId(value) } + labelWidth={142} + /> + ); + } + return null; + }; + return ( @@ -237,6 +309,25 @@ export const PluginDataSourceForm = (props: DatasourceFormProps) => { ); })} + + {trans("query.authentication")} + setAuthType(value)} + labelWidth={142} + /> + {showUserAuthSourceSelector()} + {showAuthItem(authType)} + + + + + + + {isExtraParamsRefreshing && ( )}