跳到主要内容
版本:Current

系统架构

整体架构​

请求路径​

  1. 未登录访问业务页:middleware.ts 导出的 auth 拦截,转到 /auth/signin。
  2. /auth 与路径以 /public 开头的页面不要求登录。
  3. Google 回调后 signIn 回调调用 isEmailAllowedToSignIn:空表白名单策略见 Authentication。
  4. JWT session 注入 user.id 与 user.role(查 public.users;缺省为 voter)。
  5. 写操作走 Server Actions(加入竞选、分票、CRUD),不是 REST。唯一 HTTP API 是 Auth.js。

权限边界​

层做什么不做什么
middleware未登录拦截不看角色
app/layout.tsx 侧栏按角色隐藏入口不能当安全边界
lib/admin-auth.tsadmin / moderator 的页面与 Action投票提交另有专用校验
投票 Action登录、非 admin、ongoing、候选人合法、分票合计不处理开闭投票

结果页 /campaigns/[id]/result 当前没有角色校验:任何已登录用户知道 URL 即可打开。进行中只显示等待文案;结束后可见排名。

数据流(一场竞选)​