feat(web): 增加单点登录分流与本地应急入口

开启统一认证后,正常登录入口直接跳转认证中心,并将本地账号入口收敛到 /login 应急页;未开启统一认证时继续保留工作台内原有登录方式。

影响范围仅限 Web 登录路由、认证入口展示和相关测试,不修改认证接口或 OpenAPI。风险主要在运行时身份状态判断,已通过 141 项前端测试、生产构建、无缓存类型检查及浏览器分支验证。
This commit is contained in:
2026-07-31 13:43:06 +08:00
parent cae97b6f77
commit 88c971564a
10 changed files with 169 additions and 14 deletions
+9 -8
View File
@@ -25,8 +25,6 @@ export function AuthPanel(props: {
oidcEnabled: boolean;
onOIDCLogin: () => void;
}) {
const visibleTabs = props.oidcEnabled ? tabs.filter((tab) => tab.value !== 'register') : tabs;
const visibleMode = props.oidcEnabled && props.authMode === 'register' ? 'login' : props.authMode;
return (
<section className="authShell" aria-label="登录">
<Card className="authCard">
@@ -37,23 +35,26 @@ export function AuthPanel(props: {
</div>
</CardHeader>
<CardContent className="authContent">
{props.oidcEnabled && (
{props.oidcEnabled ? (
<Button type="button" disabled={props.state === 'loading'} onClick={props.onOIDCLogin}>
<LogIn size={15} />
使
</Button>
) : (
<>
<Tabs value={props.authMode} tabs={tabs} onValueChange={props.onAuthModeChange} />
{props.authMode === 'login' && <LocalLoginForm {...props} />}
{props.authMode === 'register' && <RegisterFormView {...props} />}
{props.authMode === 'external' && <ExternalTokenForm {...props} />}
</>
)}
<Tabs value={visibleMode} tabs={visibleTabs} onValueChange={props.onAuthModeChange} />
{visibleMode === 'login' && <LoginFormView {...props} />}
{visibleMode === 'register' && <RegisterFormView {...props} />}
{visibleMode === 'external' && <ExternalTokenForm {...props} />}
</CardContent>
</Card>
</section>
);
}
function LoginFormView(props: {
export function LocalLoginForm(props: {
loginForm: LoginForm;
state: LoadState;
onLoginChange: (value: LoginForm) => void;