This is an automated email from the ASF dual-hosted git repository.
lauraxia pushed a commit to branch antdUI-gravitino-base1.1.0
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/antdUI-gravitino-base1.1.0 by
this push:
new e953c6f4fc support simple type login
e953c6f4fc is described below
commit e953c6f4fcf73c99ab7af3eab9886b943427e021
Author: Qian Xia <[email protected]>
AuthorDate: Wed Jan 7 17:36:20 2026 +0800
support simple type login
---
web/web/src/app/login/components/DefaultLogin.js | 80 +++++++++++++++---------
web/web/src/app/rootLayout/MainNav.js | 5 +-
web/web/src/app/rootLayout/SiteHeader.js | 2 +-
web/web/src/app/rootLayout/UserSetting.js | 30 +--------
web/web/src/components/SetOwnerDialog.js | 3 +-
web/web/src/lib/provider/session.js | 9 ++-
web/web/src/lib/store/auth/index.js | 43 ++++++++-----
web/web/src/lib/utils/axios/index.js | 7 +++
8 files changed, 99 insertions(+), 80 deletions(-)
diff --git a/web/web/src/app/login/components/DefaultLogin.js
b/web/web/src/app/login/components/DefaultLogin.js
index 7727d2a4dd..b317c31a29 100644
--- a/web/web/src/app/login/components/DefaultLogin.js
+++ b/web/web/src/app/login/components/DefaultLogin.js
@@ -24,7 +24,7 @@ import { useEffect } from 'react'
import { Button, Form, Input } from 'antd'
import { useAppDispatch, useAppSelector } from '@/lib/hooks/useStore'
-import { loginAction, setIntervalIdAction, clearIntervalId } from
'@/lib/store/auth'
+import { loginAction, setIntervalIdAction, clearIntervalId, setAuthUser } from
'@/lib/store/auth'
function DefaultLogin() {
const router = useRouter()
@@ -39,8 +39,13 @@ function DefaultLogin() {
}, [store.intervalId])
const onFinish = async values => {
- await dispatch(loginAction({ params: values, router }))
- await dispatch(setIntervalIdAction())
+ if (store.authType === 'simple' && store.anthEnable) {
+ await dispatch(setAuthUser({ name: values.username, type: 'user' }))
+ router.push('/metalakes')
+ } else {
+ await dispatch(loginAction({ params: values, router }))
+ await dispatch(setIntervalIdAction())
+ }
}
return (
@@ -56,36 +61,51 @@ function DefaultLogin() {
scope: ''
}}
>
- <Form.Item
- label='Grant Type'
- name='grant_type'
- rules={[{ required: true, message: 'Grant Type is required' }]}
- className='mt-4'
- >
- <Input disabled placeholder='' />
- </Form.Item>
+ {store.authType === 'simple' && store.anthEnable ? (
+ <>
+ <Form.Item label='Username' name='username' rules={[{ required:
true, message: 'Username is required' }]}>
+ <Input placeholder='' />
+ </Form.Item>
+ </>
+ ) : (
+ <>
+ <Form.Item
+ label='Grant Type'
+ name='grant_type'
+ rules={[{ required: true, message: 'Grant Type is required' }]}
+ className='mt-4'
+ >
+ <Input disabled placeholder='' />
+ </Form.Item>
- <Form.Item
- label='Client ID'
- name='client_id'
- rules={[{ required: true, message: 'Client ID is required' }]}
- className='mt-4'
- >
- <Input placeholder='' />
- </Form.Item>
+ <Form.Item
+ label='Client ID'
+ name='client_id'
+ rules={[{ required: true, message: 'Client ID is required' }]}
+ className='mt-4'
+ >
+ <Input placeholder='' />
+ </Form.Item>
- <Form.Item
- label='Client Secret'
- name='client_secret'
- rules={[{ required: true, message: 'Client Secret is required' }]}
- className='mt-4'
- >
- <Input placeholder='' />
- </Form.Item>
+ <Form.Item
+ label='Client Secret'
+ name='client_secret'
+ rules={[{ required: true, message: 'Client Secret is required' }]}
+ className='mt-4'
+ >
+ <Input placeholder='' />
+ </Form.Item>
- <Form.Item label='Scope' name='scope' rules={[{ required: true, message:
'Scope is required' }]} className='mt-4'>
- <Input placeholder='' />
- </Form.Item>
+ <Form.Item
+ label='Scope'
+ name='scope'
+ rules={[{ required: true, message: 'Scope is required' }]}
+ className='mt-4'
+ >
+ <Input placeholder='' />
+ </Form.Item>
+ </>
+ )}
<Form.Item className='mb-7 mt-12'>
<Button type='primary' htmlType='submit' block size='large'>
diff --git a/web/web/src/app/rootLayout/MainNav.js
b/web/web/src/app/rootLayout/MainNav.js
index 7dd60c57a1..b203504a46 100644
--- a/web/web/src/app/rootLayout/MainNav.js
+++ b/web/web/src/app/rootLayout/MainNav.js
@@ -93,7 +93,7 @@ export function MainNav() {
]
if (anthEnable && currentMetalake) {
- const ownerData = await to(
+ const [resError, res] = await to(
dispatch(
getCurrentEntityOwner({
metalake: currentMetalake,
@@ -102,7 +102,8 @@ export function MainNav() {
})
)
)
- if (!authUser || (authUser && authUser.name === ownerData?.name)) {
+ const ownerData = res?.payload?.owner
+ if (anthEnable || (authUser && authUser.name === ownerData?.name)) {
items.push({
key: ROUTES.Access,
icon: <Icons.iconify icon='la:users-cog' className='my-icon' />,
diff --git a/web/web/src/app/rootLayout/SiteHeader.js
b/web/web/src/app/rootLayout/SiteHeader.js
index eec6821a30..97b6f80a66 100644
--- a/web/web/src/app/rootLayout/SiteHeader.js
+++ b/web/web/src/app/rootLayout/SiteHeader.js
@@ -68,7 +68,7 @@ export function SiteHeader() {
}
// If we're not on the metalakes list page and metalake is missing, fill
it
- if (!['/', '/ui', '/metalakes', '/ui/metalakes'].includes(pathname) &&
!metalakeParam) {
+ if (!['/', '/ui', '/metalakes', '/ui/metalakes', '/login',
'/ui/login'].includes(pathname) && !metalakeParam) {
const first = store.metalakes[0].name || ''
if (first) {
const qs = makeNewSearch({ metalake: first })
diff --git a/web/web/src/app/rootLayout/UserSetting.js
b/web/web/src/app/rootLayout/UserSetting.js
index 05b42a9e77..b7547a2324 100644
--- a/web/web/src/app/rootLayout/UserSetting.js
+++ b/web/web/src/app/rootLayout/UserSetting.js
@@ -39,7 +39,7 @@ export default function UserSetting() {
const [openCreateMeta, setOpenCreateMeta] = useState(false)
const [showLogoutButton, setShowLogoutButton] = useState(false)
const auth = useAppSelector(state => state.auth)
- const { serviceAdmins, authUser, authToken } = auth
+ const { serviceAdmins, authUser, anthEnable } = auth
const [session, setSession] = useState({})
const router = useRouter()
const pathname = usePathname()
@@ -54,30 +54,6 @@ export default function UserSetting() {
}
}, [dispatch, pathname])
- useEffect(() => {
- const checkAuthStatus = async () => {
- try {
- if (authToken) {
- setShowLogoutButton(true)
-
- return
- }
-
- const provider = await oauthProviderFactory.getProvider()
- if (provider) {
- const isAuth = await provider.isAuthenticated()
- setShowLogoutButton(isAuth)
- } else {
- setShowLogoutButton(false)
- }
- } catch (error) {
- setShowLogoutButton(false)
- }
- }
-
- checkAuthStatus()
- }, [authToken])
-
const handleCreateMetalake = () => {
setOpenCreateMeta(true)
}
@@ -140,7 +116,7 @@ export default function UserSetting() {
)
})) || []
},
- ...(showLogoutButton
+ ...(anthEnable
? [
{
key: 'divider2',
@@ -155,7 +131,7 @@ export default function UserSetting() {
]
: [])
],
- [authUser, serviceAdmins, store.metalakes, currentMetalake,
showLogoutButton]
+ [authUser, serviceAdmins, store.metalakes, currentMetalake, anthEnable]
)
return (
diff --git a/web/web/src/components/SetOwnerDialog.js
b/web/web/src/components/SetOwnerDialog.js
index 113fd18d80..38a147c9ef 100644
--- a/web/web/src/components/SetOwnerDialog.js
+++ b/web/web/src/components/SetOwnerDialog.js
@@ -30,7 +30,7 @@ import { useEffect } from 'react'
const { Paragraph } = Typography
export default function SetOwnerDialog({ ...props }) {
- const { open, setOpen, metalake, metadataObjectType, metadataObjectFullName,
mutateOwner } = props
+ const { open, setOpen, metalake, metadataObjectType, metadataObjectFullName
} = props
const [confirmLoading, setConfirmLoading] = useState(false)
const cascaderOwnerRef = useRef(null)
const dispatch = useAppDispatch()
@@ -69,7 +69,6 @@ export default function SetOwnerDialog({ ...props }) {
}
await dispatch(setEntityOwner({ metalake, metadataObjectType,
metadataObjectFullName, data: submitData }))
- mutateOwner && mutateOwner()
setConfirmLoading(false)
setOpen(false, true)
})
diff --git a/web/web/src/lib/provider/session.js
b/web/web/src/lib/provider/session.js
index 074d0c60b3..553605d7d6 100644
--- a/web/web/src/lib/provider/session.js
+++ b/web/web/src/lib/provider/session.js
@@ -84,6 +84,7 @@ const AuthProvider = ({ children }) => {
const initAuth = async () => {
const [authConfigsErr, resAuthConfigs] = await
to(dispatch(getAuthConfigs()))
const authType = resAuthConfigs?.payload?.authType
+ const anthEnable = resAuthConfigs?.payload?.anthEnable
// Check sessionStorage cache first, only fetch if no cache
const cachedGithubInfo = typeof window !== 'undefined' &&
window.sessionStorage.getItem('githubInfo')
@@ -103,7 +104,13 @@ const AuthProvider = ({ children }) => {
if (authType === 'simple') {
dispatch(initialVersion())
- goToMetalakeListPage()
+ const sessionUser = typeof window !== 'undefined' &&
JSON.parse(window.sessionStorage.getItem('simpleAuthUser'))
+ if (anthEnable && !sessionUser) {
+ router.push('/login')
+ } else {
+ dispatch(setAuthUser(sessionUser))
+ goToMetalakeListPage()
+ }
} else if (authType === 'oauth') {
const tokenToUse = await oauthProviderFactory.getAccessToken()
const user = await oauthProviderFactory.getUserProfile()
diff --git a/web/web/src/lib/store/auth/index.js
b/web/web/src/lib/store/auth/index.js
index 4ef8834fe0..ca11e64d22 100644
--- a/web/web/src/lib/store/auth/index.js
+++ b/web/web/src/lib/store/auth/index.js
@@ -98,25 +98,29 @@ export const loginAction =
createAsyncThunk('auth/loginAction', async ({ params,
export const logoutAction = createAsyncThunk('auth/logoutAction', async ({
router }, { getState, dispatch }) => {
// Clear provider authentication data first
- try {
- const provider = await oauthProviderFactory.getProvider()
- if (provider) {
- await provider.clearAuthData()
- console.log('[Logout Action] Provider cleanup completed')
+ if (getState().auth.authType === 'oauth') {
+ try {
+ const provider = await oauthProviderFactory.getProvider()
+ if (provider) {
+ await provider.clearAuthData()
+ console.log('[Logout Action] Provider cleanup completed')
+ }
+ } catch (error) {
+ console.warn('[Logout Action] Provider cleanup failed:', error)
}
- } catch (error) {
- console.warn('[Logout Action] Provider cleanup failed:', error)
- }
-
- // Clear legacy auth tokens
- localStorage.removeItem('accessToken')
- localStorage.removeItem('authParams')
- localStorage.removeItem('expiredIn')
- localStorage.removeItem('isIdle')
- localStorage.removeItem('version')
- dispatch(clearIntervalId())
- dispatch(setAuthToken(''))
+ // Clear legacy auth tokens
+ localStorage.removeItem('accessToken')
+ localStorage.removeItem('authParams')
+ localStorage.removeItem('expiredIn')
+ localStorage.removeItem('isIdle')
+ localStorage.removeItem('version')
+
+ dispatch(clearIntervalId())
+ dispatch(setAuthToken(''))
+ } else {
+ dispatch(setAuthUser(null))
+ }
await router.push('/login')
return { token: null }
@@ -180,6 +184,11 @@ export const authSlice = createSlice({
state.expiredIn = action.payload
},
setAuthUser(state, action) {
+ if (action.payload) {
+ sessionStorage.setItem('simpleAuthUser',
JSON.stringify(action.payload))
+ } else {
+ sessionStorage.removeItem('simpleAuthUser')
+ }
state.authUser = action.payload
}
},
diff --git a/web/web/src/lib/utils/axios/index.js
b/web/web/src/lib/utils/axios/index.js
index aaa06e034d..97955be0ac 100644
--- a/web/web/src/lib/utils/axios/index.js
+++ b/web/web/src/lib/utils/axios/index.js
@@ -206,6 +206,13 @@ const transform = {
if (token && config?.requestOptions?.withToken !== false) {
// ** jwt token
config.headers.Authorization = options.authenticationScheme ?
`${options.authenticationScheme} ${token}` : token
+ } else if (window.sessionStorage.getItem('simpleAuthUser')) {
+ // Simple auth fallback
+ const simpleAuthToken =
window.sessionStorage.getItem('simpleAuthToken')
+ const user =
JSON.parse(window.sessionStorage.getItem('simpleAuthUser'))?.name
+ if (user) {
+ config.headers.Authorization = `Basic ${Buffer.from(user ||
'').toString('base64')}`
+ }
}
} catch (error) {
console.warn('Failed to get access token:', error)