Compare commits
21
Commits
v2.2.0
...
codex/shiyan
No files matched your search
+20
-1
@@ -67,7 +67,26 @@ Operations__MySqlClientPath=mysql
|
||||
Jwt__Issuer=Jiaowu.Api
|
||||
Jwt__Audience=Jiaowu.Web
|
||||
Jwt__Key=REPLACE_WITH_AT_LEAST_32_RANDOM_BYTES
|
||||
Jwt__ExpireMinutes=60
|
||||
Jwt__AccessTokenMinutes=10
|
||||
Jwt__WebIdleMinutes=30
|
||||
Jwt__AppIdleMinutes=4320
|
||||
|
||||
# Keycloak SSO(可选)。Authority 必须指向 realm,例如:
|
||||
# https://sso.example.edu.cn/realms/mingxu
|
||||
Sso__Enabled=false
|
||||
# Sso__DisplayName=学校统一身份认证
|
||||
# Sso__Authority=https://sso.example.edu.cn/realms/mingxu
|
||||
# Sso__ClientId=jiaowu-web
|
||||
# Sso__ClientSecret=REPLACE_WITH_KEYCLOAK_CLIENT_SECRET
|
||||
# Sso__UserNameClaim=preferred_username
|
||||
# Sso__RequireHttpsMetadata=true
|
||||
# 首次 SSO 登录优先绑定同名本地账号;用户名不同时由用户输入现有账号密码完成绑定。
|
||||
# 不会自动创建账号或授予角色。
|
||||
# Sso__LinkExistingUsersByUserName=true
|
||||
# 前后端同域部署时留空;开发或分离部署时填写前端公开根地址。
|
||||
# Sso__FrontendBaseUrl=https://jiaowu.example.edu.cn
|
||||
# 必须与 Keycloak 客户端的 Valid redirect URI 完全一致。
|
||||
# Sso__CallbackUrl=https://jiaowu.example.edu.cn/signin-keycloak
|
||||
|
||||
AllowedHosts=jiaowu.example.edu.cn
|
||||
Cors__Origins__0=https://jiaowu.example.edu.cn
|
||||
|
||||
@@ -144,6 +144,50 @@ Kubernetes 或密钥管理系统仍可覆盖文件中的值。
|
||||
`chmod 600 .env`,Windows 应通过 ACL 只允许服务账号和管理员读取。连接串中的证书
|
||||
路径必须是运行服务器上的实际路径。
|
||||
|
||||
### Keycloak 单点登录(可选)
|
||||
|
||||
系统支持 Keycloak 的 OpenID Connect 授权码流程。Keycloak 只负责验证身份;账号是否
|
||||
启用、角色和学院数据范围仍以本系统 Identity 数据为准。首次 SSO 登录会用
|
||||
`preferred_username`(可通过 `Sso__UserNameClaim` 修改)优先匹配已有登录账号并记录
|
||||
外部账号绑定。如果 Keycloak 用户名与教务系统账号不同,认证后会进入账户绑定页,用户
|
||||
需要再输入一次现有教务系统账号和密码;验证成功后建立永久绑定并直接登录。绑定不会
|
||||
自动创建本地账号、修改人员档案或从 Keycloak 导入高权限角色。同一 Keycloak 身份不能
|
||||
绑定多个本地账号,同一本地账号也不能绑定多个 Keycloak 身份。原账号密码登录和学生
|
||||
自助激活入口不受影响。
|
||||
|
||||
在 Keycloak 中创建 OpenID Connect 客户端,并至少配置:
|
||||
|
||||
- Valid redirect URI:`https://jiaowu.example.edu.cn/signin-keycloak`
|
||||
- Valid post logout redirect URI:`https://jiaowu.example.edu.cn/*`(若后续启用 Keycloak 全局退出)
|
||||
- Standard flow:开启;Implicit flow:关闭;PKCE:`S256`
|
||||
|
||||
然后在 `.env` 中配置:
|
||||
|
||||
```dotenv
|
||||
Sso__Enabled=true
|
||||
Sso__DisplayName=学校统一身份认证
|
||||
Sso__Authority=https://sso.example.edu.cn/realms/mingxu
|
||||
Sso__ClientId=jiaowu-web
|
||||
Sso__ClientSecret=REPLACE_WITH_KEYCLOAK_CLIENT_SECRET
|
||||
Sso__UserNameClaim=preferred_username
|
||||
Sso__RequireHttpsMetadata=true
|
||||
Sso__LinkExistingUsersByUserName=true
|
||||
Sso__FrontendBaseUrl=https://jiaowu.example.edu.cn
|
||||
Sso__CallbackUrl=https://jiaowu.example.edu.cn/signin-keycloak
|
||||
```
|
||||
|
||||
前后端同域时 `Sso__FrontendBaseUrl` 可以留空。本地 Vite 开发默认回到
|
||||
`http://localhost:5173`,Keycloak 测试客户端需同时允许
|
||||
`http://localhost:5255/signin-keycloak`。`Sso__CallbackUrl` 是应用实际发送给 Keycloak
|
||||
的 `redirect_uri`,必须与客户端的 Valid redirect URI 完全一致;建议生产环境始终显式
|
||||
配置它,避免反向代理导致 scheme 或 host 推导错误。个人账户页的“管理员配置参考”也会
|
||||
显示当前生效的完整回调地址。多实例部署应配置 Redis,以便任意实例都能兑换两分钟内
|
||||
有效、使用后即删除的 SSO 登录码及五分钟内有效的绑定意图。
|
||||
|
||||
用户登录后可从页面右上角进入“个人账户”,主动绑定或解除 Keycloak 账号。主动绑定先
|
||||
使用当前 JWT 创建五分钟有效的一次性绑定意图,再跳转 Keycloak;回调只能绑定到发起该
|
||||
意图的本地账号。解绑需要再次验证本地密码,避免仅凭未锁屏的登录会话解除身份关联。
|
||||
|
||||
### Linux systemd 服务
|
||||
|
||||
仓库提供 [`deploy/systemd/jiaowu.service`](deploy/systemd/jiaowu.service),适用于
|
||||
|
||||
+3
-1
@@ -30,7 +30,9 @@ x-jiaowu-environment: &jiaowu-environment
|
||||
Jwt__Issuer: Jiaowu.Api
|
||||
Jwt__Audience: Jiaowu.Web
|
||||
Jwt__Key: "${JWT_KEY:?请在 .env.docker 中设置 JWT_KEY}"
|
||||
Jwt__ExpireMinutes: "60"
|
||||
Jwt__AccessTokenMinutes: "10"
|
||||
Jwt__WebIdleMinutes: "30"
|
||||
Jwt__AppIdleMinutes: "4320"
|
||||
AllowedHosts: "${ALLOWED_HOSTS:-localhost}"
|
||||
Cors__Origins__0: "${CORS_ORIGIN:-http://localhost:8080}"
|
||||
OfficialDocuments__PublicBaseUrl: "${OFFICIAL_DOCUMENTS_PUBLIC_BASE_URL:-http://localhost:8080}"
|
||||
|
||||
Loaded 3 of 108 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user