Spring Security3默认过滤器链的第一个过滤器就是org.springframework.security.web.context.SecurityContextPersistenceFilter,这个Filter就是持久化SecurityContext实例的,流程图:
看SecurityContextPersistenceFilter代码:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; if (request.getAttribute(FILTER_APPLIED) != null) { // ensure that filter is only applied once per request chain.doFilter(request, response); return; } final boolean debug = logger.isDebugEnabled(); request.setAttribute(FILTER_APPLIED, Boolean.TRUE); if (forceEagerSessionCreation) { HttpSession session = request.getSession(); if (debug && session.isNew()) { logger.debug("Eagerly created session: " + session.getId()); } } HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, response); // 从SecurityContextRepository中获取SecurityContext实例 SecurityContext contextBeforeChainExecution = repo.loadContext(holder); try { // 将SecurityContext实例到SecurityContextHolder中,后面的过滤器以及我们在程序中一般都从这个holder中拿SecurityContext实例 SecurityContextHolder.setContext(contextBeforeChainExecution); chain.doFilter(holder.getRequest(), holder.getResponse()); } finally { // 先获取SecurityContext实例 SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext(); // Crucial removal of SecurityContextHolder contents - do this before anything else. //再从holder中清除 SecurityContextHolder.clearContext(); // 当SecurityContext实例被update,或session中SecurityContext实例为空,将其放入session中 repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse()); request.removeAttribute(FILTER_APPLIED); if (debug) { logger.debug("SecurityContextHolder now cleared, as request processing completed"); } } }
分析一下HttpSessionSecurityContextRepository的loadContext方法:
public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) { HttpServletRequest request = requestResponseHolder.getRequest(); HttpServletResponse response = requestResponseHolder.getResponse(); HttpSession httpSession = request.getSession(false); // 从session中获取SecurityContext对象 SecurityContext context = readSecurityContextFromSession(httpSession); if (context == null) { if (logger.isDebugEnabled()) { logger.debug("No SecurityContext was available from the HttpSession: " + httpSession +". " + "A new one will be created."); } // 如果SecurityContext对象是空的,创建一个SecurityContext实例 context = generateNewContext(); } // 注意:此处用SaveToSessionResponseWrapper替换了原生的httpresponse对象,可能和自定义的response wrapper对象有冲突。 requestResponseHolder.setResponse(new SaveToSessionResponseWrapper(response, request, httpSession != null, context.hashCode())); return context; }
这个过滤器比较简单,它维护了SecurityContextHolder中SecurityContext实例,我们也很方便的从SecurityContextHolder中获取SecurityContext对象
相关推荐
《深入剖析Spring Security Web 3源码...总结,通过对`spring-security-web-3`源码的分析,开发者不仅可以掌握Spring Security的内在工作原理,还能提升解决实际安全问题的能力,为构建更安全的Web应用提供坚实的基础。
默认实现是基于内存的UserDetailsService,但可以根据需求配置数据库或其他持久化存储。认证流程通常包含以下步骤:用户提交凭证 -> Spring Security验证 -> 创建Authentication对象并存储在SecurityContext中。 **...
- 可以使用`PersistentTokenBasedRememberMeServices`将记住我信息持久化到数据库。 6. **CSRF保护**: - Spring Security默认启用CSRF(跨站请求伪造)防护,防止恶意第三方模拟用户发送请求。 - 可以通过添加`...
- **记住我功能**:SpringSecurity支持“记住我”功能,通过持久化令牌来实现长期认证。 4. **授权机制** - **Role-based Access Control (RBAC)**:基于角色的访问控制是最常见的授权方式,通过分配角色给用户,...
3. Spring Security 4.2的新特性 27 3.1 Web改进 27 3.2配置改进 28 3.3杂项 28 4.样品和指南(从这里开始) 28 5. Java配置 29 5.1 Hello Web安全Java配置 29 5.1.1 AbstractSecurityWebApplicationInitializer 31 ...
- **在请求之间保存 SecurityContext:** 保持 SecurityContext 在多个请求之间的持久化。 **5.5 Spring Security 中的访问控制** - **安全和 AOP 建议:** 结合 AOP 实现细粒度的访问控制。 - **安全对象和 ...
10.3. 持久化标记方法 10.4. Remember-Me接口和实现 10.4.1. TokenBasedRememberMeServices 10.4.2. PersistentTokenBasedRememberMeServices 11. 会话管理 11.1. SessionManagementFilter 11.2. ...
` PersistentTokenBasedRememberMeServices`是一个实现,使用持久化的令牌来实现此功能。 10. **AOP安全拦截**: Spring Security 也提供了基于AOP的安全拦截,可以与Spring的切面编程无缝集成,实现细粒度的访问...
Remember Me服务允许用户在一段时间内自动登录,通过在客户端存储持久化的认证信息实现。 ### 8. **集成其他框架** Spring Security可以方便地与其他Spring技术(如Spring MVC、Spring Boot)以及非Spring框架(如...
- 使用Remember-Me服务实现持久化会话,使用户在关闭浏览器后仍能保持登录状态。 - OAuth2和OpenID Connect集成,为现代Web应用提供社交登录功能。 3. **授权模型**: - 角色与权限的概念,以及如何在Spring ...
此外,它还可以配合rememberMe服务,清除用户在注销时的持久化身份验证信息,即删除用户cookie。 3. AuthenticationProcessingFilter:这是处理基于表单登录的过滤器,主要负责验证用户名和密码。默认情况下,它...
在Spring MVC中,默认情况下,Spring Security 在Spring Security过滤器链中添加了一个额外的过滤器,能够持久化Security 上下文(SecurityContextPersistenceFilter类)。反过来,它将Security 上下文的持久性委托...
它使用安全的令牌系统来实现持久化的用户认证。 8. **RESTful 安全**:对于 RESTful API,Spring Security 提供了基于 JWT 的认证和授权方案,可以创建和验证 JSON Web Tokens 来安全地传输用户信息。 9. **异常...
这涉及到`PersistentTokenRepository`,它存储用户的持久化token,以便下次用户访问时,系统可以自动完成登录过程。 6. **异常处理**:如果认证或授权失败,Spring Security会抛出相应的异常,你可以通过自定义`...
服务器端可能有一个UserDetailsService接口的实现,该接口用于从数据库或任何持久化存储中查找用户信息。如果用户名和密码匹配,Spring Security会生成一个JWT(JSON Web Token)或者使用Spring Session管理用户会话...
在实际应用中,我们可以使用DAO持久化这些信息到数据库中,而不仅仅是在控制台上打印信息。最后,为了使监听器生效,我们需要在Acegi的配置文件中声明这个监听器。 2. 在多个请求之间共享SecurityContext `...
3. **Mybatis**:Mybatis是一个持久层框架,它提供了方便的SQL映射机制,使得开发者可以直接编写SQL语句,避免了JDBC的繁琐操作。在登录功能中,Mybatis可能被用来查询数据库中的用户信息,与用户输入的登录信息进行...