❯ 系统如何保证 在没有登录的情况下 无法直接访问网页?                                                                                                                                     

                                                                                                                                                                                         

● 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)                                                                                                                                         

  (ctrl+o to expand)                                                                                                                                                                     

                                                                                                                                                                                         

系统通过三层防御机制保证未登录无法直接访问网页                                                                                                                                         

                                                                                                                                                                                         

  第一层:Servlet 过滤器 (****************Filter)                                                                                                                                          

                                                                                                                                                                                         

  文件: src/main/java/openlabx/org/cn/security/web/****************Filter.java:13                                                                                                         

                                                                                                                                                                                         

  @WebFilter(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() → 数据库验证用户名密码(PBKDF2WithHmacSHA256)                                                                  

  3. 验证成功后,用户名和角色集合写入 HTTP Session                                                                                                                                       

  4. 重定向到 /app/welcome.xhtml,后续所有 /app/* 请求都经过上述三层检查                                                                                                                 

  5. 登出时调用 session.invalidate() 销毁整个 Session                                                                                                                                    

                                                                                                                                                                                         

  公开页面白名单                                                                                                                                                                         

                                                                                                                                                                                         

  AuthorizationPhaseListener 中定义了允许未登录访问的页面:                                                                                                                              

  - /login.xhtml                                                                                                                                                                         

  - /403.xhtml(禁止访问)                                                                                                                                                               

  - /500.xhtml(服务器错误)                                                                                                                                                             

                                                                                                                                                                                         

  除此之外的所有页面都必须登录后才能访问。                                                                                                                                               

                                                                                                                                                                                         

✻ Worked for 1m 42s

更多推荐