Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/common/auth/constants/group_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class Group(Enum):
# 对话相关
CHAT_USER_GROUP = ("CHAT_USER_GROUP", _("Chat User Group"))
CHAT_USER_AUTH = ("CHAT_USER_AUTH", _("Chat User Auth"))
PORTAL = ("PORTAL", _("portal"))
PORTAL = ("PORTAL", _("Portal Setting"))
# 其他
OTHER = ("OTHER", _("Other"))
HOMEPAGE = ("HOMEPAGE", _("Home page"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ import { LOGIN_METHOD_LABELS } from '@/constants/auth'
import { useStore } from '@/stores/admin'
import { MsgSuccess } from '@/utils/message'
import { useApplicationDetailContext } from '../../context'
import type { ApplicationAccessToken } from '@/api/types'

defineOptions({ name: 'AccessRestrictionDrawer' })

const props = defineProps<{ initialConfig?: ApplicationAccessToken }>()
const emit = defineEmits<{ closed: [] }>()
const { auth } = useStore()
const { applicationId, resourceApi } = useApplicationDetailContext()
Expand Down Expand Up @@ -49,8 +51,10 @@ function handleLoginMethodsChange() {
function loadAccessRestriction() {
if (loading.value) return
loading.value = true
return resourceApi.application
.getAccessToken(applicationId.value)
// 优先复用概览页已获取的配置,避免重复请求 access_token 接口。
const fetchConfig = () =>
props.initialConfig ? Promise.resolve(props.initialConfig) : resourceApi.application.getAccessToken(applicationId.value)
return fetchConfig()
.then((config) => {
Object.assign(form, {
language: config.language,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<script setup lang="ts">
import { ref } from 'vue'
import AccessRestrictionDrawer from './AccessRestrictionDrawer.vue'
import type { ApplicationAccessToken } from '@/api/types'

defineProps<{ accessTokenConfig?: ApplicationAccessToken }>()

defineOptions({ name: 'ButtonAccessRestriction' })

Expand All @@ -17,5 +20,5 @@ function handleOpenAccessRestriction() {
<MkIcon name="icon-lock" />
<span>访问限制</span>
</el-button>
<AccessRestrictionDrawer v-if="drawerVisible" @closed="drawerVisible = false" />
<AccessRestrictionDrawer v-if="drawerVisible" :initial-config="accessTokenConfig" @closed="drawerVisible = false" />
</template>
7 changes: 6 additions & 1 deletion ui/src/views/application-detail/overview/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import ButtonDisplaySetting from './display-setting/ButtonDisplaySetting.vue'
import ButtonApiKey from './api-key/ButtonApiKey.vue'
import perm from '@/permission/index.ts'
import { isSystemResource } from '@/utils/resource-context.ts'
import type { ApplicationAccessToken } from '@/api/types'

defineOptions({ name: 'ApplicationOverviewView' })
defineProps<ResourceDetailPageProps>()
Expand All @@ -31,6 +32,7 @@ function applicationOverviewPermission(method: ApplicationOverviewPermissionMeth
}

/* 基本信息:Web 访问链接与访问开关 */
const accessTokenConfig = ref<ApplicationAccessToken>()
const accessToken = ref('')
const webAccessActive = ref(false)
const loading = ref(false)
Expand All @@ -57,6 +59,7 @@ function handleChangeWebAccess() {
.then((config) => {
webAccessActive.value = config.is_active
accessToken.value = config.access_token
accessTokenConfig.value = config
MsgSuccess(config.is_active ? '已启用' : '已禁用')
return true
})
Expand All @@ -79,6 +82,7 @@ function handleResetAccessToken() {
.then((config) => {
accessToken.value = config.access_token
webAccessActive.value = config.is_active
accessTokenConfig.value = config
MsgSuccess('刷新成功')
})
.finally(() => {
Expand Down Expand Up @@ -106,6 +110,7 @@ function handleChangeApiKeyAccess() {

onMounted(() => {
return resourceApi.application.getAccessToken(applicationId.value).then((config) => {
accessTokenConfig.value = config
accessToken.value = config.access_token
webAccessActive.value = config.is_active
apiKeyEnabled.value = config.enable_api_key ?? false
Expand Down Expand Up @@ -155,7 +160,7 @@ onMounted(() => {
<!-- 嵌入第三方 -->
<ButtonEmbedThirdParty v-if="applicationOverviewPermission('overviewEmbed')" :share-url="accessUrl" :access-token="accessToken" />
<!-- 访问限制 -->
<ButtonAccessRestriction v-if="applicationOverviewPermission('overviewAccess')" />
<ButtonAccessRestriction v-if="applicationOverviewPermission('overviewAccess')" :access-token-config="accessTokenConfig" />
<!-- 显示设置 -->
<ButtonDisplaySetting v-if="applicationOverviewPermission('overviewDisplay')" />
</div>
Expand Down
12 changes: 9 additions & 3 deletions ui/src/views/chat/login/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,14 @@ const getExternalLoginUrl = (authType: LoginMethod): Promise<string> => {
if (!config) return ''

const { accessToken } = auth
const queryString = getRouteQueryString()
const callbackUrl = `${config.redirectUrl}${accessToken ? `/${accessToken}` : ''}${queryString ? `?${queryString}` : ''}`
// accessToken 统一放到回调地址的 query 参数中,不再拼接路径段
const params = new URLSearchParams()
if (accessToken) params.set('accessToken', accessToken)
new URLSearchParams(getRouteQueryString()).forEach((value, key) => {
if (key !== 'accessToken') params.append(key, value)
})
const queryString = params.toString()
const callbackUrl = `${config.redirectUrl}${queryString ? `?${queryString}` : ''}`
if (authType === LOGIN_METHOD.CAS) {
if (!config.ldpUri) return ''
const separator = config.ldpUri.includes('?') ? '&' : '?'
Expand All @@ -66,7 +72,7 @@ const getExternalLoginUrl = (authType: LoginMethod): Promise<string> => {

// OAuth2 通过 state 透传 accessToken
if (!config.authEndpoint || !config.clientId) return ''
const redirectUrl = `${config.redirectUrl}${queryString ? `&${queryString}` : ''}`
const redirectUrl = `${config.redirectUrl}${queryString ? `?${queryString}` : ''}`
const state = accessToken ? `${uuidv7()}_${accessToken}` : uuidv7()
let url = `${config.authEndpoint}?client_id=${config.clientId}&response_type=code&redirect_uri=${redirectUrl}&state=${state}`
if (config.scope) url += `&scope=${config.scope}`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ function submit() {
})
}

onMounted(() => loadSetting)
onMounted(() => loadSetting())
</script>

<template>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ onActivated(() => {
<el-option v-for="workspace in workspaceOptions" :key="workspace.id" :label="workspace.name" :value="workspace.id" />
</el-select>
</el-form-item>
<el-form-item label="用户组" v-if="form.workspace_id">
<el-form-item label="用户组" v-if="form.workspace_id && selectedRoleType === ROLE_TYPE.USER">
<el-select filterable clearable multiple v-model="form.group_ids" :loading="loadingGroups" placeholder="请选择用户组" class="w-240">
<el-option v-for="userGroup in userGroups" :key="userGroup.id" :label="userGroup.name" :value="userGroup.id" />
</el-select>
Expand Down
Loading