fix: token 刷新时缺少 company_name 导致多租户过滤返回空数据

This commit is contained in:
yueli
2026-08-03 09:22:50 +08:00
parent 60c6f634ce
commit 65aba4b313
2 changed files with 8 additions and 22 deletions

View File

@ -162,22 +162,25 @@ class AuthService:
if not user_id:
raise ValueError("无效的 refresh_token")
# 重新查询数据库获取用户的 display_name避免刷新后丢失
# 重新查询数据库获取用户的 display_name + company_name,避免刷新后丢失
from app.models.system import SysUser
user = SysUser.query.get(user_id)
if user:
user_info = user.to_dict()
display_name = user_info.get('display_name', username)
user_company = user.department or ''
else:
display_name = username
user_company = ''
# 生成新的 access_token
# 生成新的 access_token(必须包含 company_name否则多租户过滤失效
new_access_token = create_access_token(
identity=user_id,
additional_claims={
'role': role,
'username': username,
'display_name': display_name
'display_name': display_name,
'company_name': user_company
}
)

View File

@ -16,28 +16,11 @@ const isLoginPage = computed(() => {
})
// 页面加载时刷新权限
onMounted(async () => {
onMounted(() => {
if (userStore.token) {
// ★ 如果 access_token 可能已过期,先主动用 refresh_token 换新 token
// 避免后续 API 调用触发 401 → 刷新 → 重试的竞态导致权限空白
try {
const refreshTokenValue = localStorage.getItem('refresh_token')
if (refreshTokenValue) {
const res = await fetch('/api/v1/auth/refresh', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ refresh_token: refreshTokenValue })
})
if (res.ok) {
const data = await res.json()
if (data.access_token) {
userStore.setToken(data.access_token)
}
}
}
} catch (e) { /* 静默,失败时走正常 401 刷新流程 */ }
userStore.refreshUserPermissions()
}
// 当 Vue 根组件挂载完毕,确保 Dify 图标一定会被加载
if (typeof (window as any).initDifyChatbot === 'function') {
(window as any).initDifyChatbot()
}