修复链上的 8 个真 bug: 1. UserDetail(UserVO,Set) 漏 setAuthorities → CAS token 构造抛 IllegalArgumentException 修:CasUserDetailsService.buildGptUserDetail 手动补 empty authorities 2. frontEndUrl 写死内网 IP,localhost 隧道用户跳回时"无法访问此网站" 修:CasUrlBuilder 用 X-Forwarded-Host / Host 动态拼 service URL 3. vite proxy 没配 /metalinfo/chat_web_backend,CAS 回跳 ticket 被前端路由吞 修:加一条 proxy(rewrite 去 /metalinfo 前缀)+ X-Forwarded-Host 转发 4. ticket 校验 service URL 跟 entry point 不一致 → CAS server mismatch 修:自定义 AuthenticationDetailsSource 用同一个动态 URL 5. sendRedirect URL 含 # 经容器编码成 %23,浏览器拿不到 hash → 404 修:改用 query 参数(/metalinfo/?cas_token=xxx),前端 router beforeEach 拦截 6. CAS 登录后 HttpSession 残留,第二次访问 /cas/login 不触发 entryPoint → 落到 DispatcherServlet → 找不到映射 → 404 Whitelabel 修:SuccessHandler 完成后 invalidate session + clear SecurityContext 7. CAS 路径漏写 Redis token,JwtAuthenticationFilter 校验时 LOGIN_TOKEN_KEY 找不到 → "token已失效" → 前端 axios interceptor 清 token 跳回 login 修:SuccessHandler 同步写 redisUtils.set,与 LoginController.saveLoginLog 对齐 8. permission.ts 没拦 query 里的 cas_token,hash 路由下 location.search 取不到 修:router beforeEach 优先消费 cas_token 再走 getSession 清理冗余: - CasProperties 删 6 个未用字段(enabled/serverLogout/appLogout/appKey/ appSecret/httpsFlag/frontEndUrl) - application.yml 同步删,移除写死的 app-secret 等敏感字段 - 删外部 override 文件 chat_web_backend/config/application.yml - casServiceProperties.setService 改占位符(实际不被读取,只满足 ServiceProperties.afterPropertiesSet 的非空校验) - 删 permission.ts 的 [CAS] [GUARD] debug log,保留 catch error 一条 新增: - CasUrlBuilder 工具类:从请求动态解析 host/scheme,多个地方共用 UI: - welcome 页面玻璃按钮 + 呼吸光晕/光感动画(用户自己调过,本次保留) - App.vue:/welcome 路径不渲染 Operates 侧边栏 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
1.2 KiB
Vue
54 lines
1.2 KiB
Vue
<template>
|
|
<div class="content">
|
|
<Operates v-show="url != '/login' && url != '/welcome' && url != '/writing/edit'" />
|
|
<RouterView />
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { watch, ref } from "vue";
|
|
import { useRouter } from "vue-router";
|
|
import Operates from "@/components/Operates.vue";
|
|
const route = useRouter();
|
|
const url = ref("");
|
|
watch(
|
|
() => route.currentRoute.value, // 监听路由的 fullPath 属性
|
|
(newVal, oldVal) => {
|
|
url.value = newVal.path;
|
|
},
|
|
{ immediate: true } // 设置 immediate: true 以在组件挂载时立即触发一次
|
|
);
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.content {
|
|
width: 100vw;
|
|
height: 100vh;
|
|
background-color: #edf2ffcc;
|
|
position: relative;
|
|
display: flex;
|
|
|
|
&::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background-image: url("./assets/images/chat/chatLogo.svg");
|
|
background-size: 45%;
|
|
background-position: right bottom;
|
|
background-repeat: no-repeat;
|
|
opacity: 0.04;
|
|
pointer-events: none;
|
|
z-index: 0;
|
|
}
|
|
.chatLogo {
|
|
width: 764px;
|
|
height: 700px;
|
|
position: absolute;
|
|
right: 0px;
|
|
bottom: 0px;
|
|
z-index: 0;
|
|
}
|
|
}
|
|
</style> |