DeepSeek using Claude Code 重构Oracle Fusion/SAP最佳业务实践:系统如何保证 在没有登录的情况下 无法直接访问网页?
❯ 系统如何保证 在没有登录的情况下 无法直接访问网页● Let me look at the authentication and access control mechanisms in this project.●Explore(Explore auth/security mechanism)⎿ Done (50 tool uses · 51.5k tokens · 1m 28s)(ctrlo to expand)●系统通过三层防御机制保证未登录无法直接访问网页第一层Servlet 过滤器 (****************Filter)文件src/main/java/openlabx/org/cn/security/web/****************Filter.java:13WebFilter(urlPatterns {/app/*})- 拦截所有 /app/* 路径下的请求- 检查 HTTP Session 中是否存在 authenticatedUser 属性- 如果为 null未登录直接 302 重定向到 /login.xhtml- JSF 资源请求jakarta.faces.resource除外允许通过第二层JSF 阶段监听器 (*******PhaseListener)文件src/main/java/openlabx/org/cn/security/web/*******PhaseListener.java:19-21- 在RESTORE_VIEW阶段每个页面渲染前执行- 再次检查 Session 中的 authenticatedUser- 如果未登录且当前页面不是公开页面重定向到 /login.xhtml- 如果已登录但无权访问当前页面通过 sec_resources 表的 RBAC 权限检查重定向到 /403.xhtml第三层Jakarta Security 桥接 (Session*******Mechanism)文件src/main/java/openlabx/org/cn/security/web/Session*******Mechanism.java:33-39- 每次请求时从 Session 读取 authenticatedUser 和 authenticatedRoles- 调用 notifyContainerAboutLogin() 通知 Jakarta EE 容器当前用户的认证状态- 使 SecurityContext.getCallerPrincipal() 等标准 API 可以正常工作认证流程1.登录页(login.xhtml) 是唯一公开入口web.xml 将其设为欢迎页2. 用户提交凭据 → LoginBean.login() → DatabaseIdentityStore.validate() → 数据库验证用户名密码PBKDF2WithHmacSHA2563. 验证成功后用户名和角色集合写入 HTTP Session4. 重定向到 /app/welcome.xhtml后续所有 /app/* 请求都经过上述三层检查5. 登出时调用 session.invalidate() 销毁整个 Session公开页面白名单AuthorizationPhaseListener 中定义了允许未登录访问的页面- /login.xhtml- /403.xhtml禁止访问- /500.xhtml服务器错误除此之外的所有页面都必须登录后才能访问。✻ Worked for 1m 42s