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)

Reply via email to