`
c04s31602
  • 浏览: 45974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring Security3学习-SecurityContext持久化

 
阅读更多

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对象

  • 大小: 27.8 KB
分享到:
评论

相关推荐

    spring-security-web-3 source code

    《深入剖析Spring Security Web 3源码...总结,通过对`spring-security-web-3`源码的分析,开发者不仅可以掌握Spring Security的内在工作原理,还能提升解决实际安全问题的能力,为构建更安全的Web应用提供坚实的基础。

    Spring Security 学习总结1_3

    默认实现是基于内存的UserDetailsService,但可以根据需求配置数据库或其他持久化存储。认证流程通常包含以下步骤:用户提交凭证 -> Spring Security验证 -> 创建Authentication对象并存储在SecurityContext中。 **...

    spring-security-demo.zip

    - 可以使用`PersistentTokenBasedRememberMeServices`将记住我信息持久化到数据库。 6. **CSRF保护**: - Spring Security默认启用CSRF(跨站请求伪造)防护,防止恶意第三方模拟用户发送请求。 - 可以通过添加`...

    SpringSecurity - 随笔

    - **记住我功能**:SpringSecurity支持“记住我”功能,通过持久化令牌来实现长期认证。 4. **授权机制** - **Role-based Access Control (RBAC)**:基于角色的访问控制是最常见的授权方式,通过分配角色给用户,...

    spring security 参考手册中文版

    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 ...

    Spring Security 3.0.1 pdf 中文参考文档

    - **在请求之间保存 SecurityContext:** 保持 SecurityContext 在多个请求之间的持久化。 **5.5 Spring Security 中的访问控制** - **安全和 AOP 建议:** 结合 AOP 实现细粒度的访问控制。 - **安全对象和 ...

    SpringSecurity 3.0.1.RELEASE.CHM

    10.3. 持久化标记方法 10.4. Remember-Me接口和实现 10.4.1. TokenBasedRememberMeServices 10.4.2. PersistentTokenBasedRememberMeServices 11. 会话管理 11.1. SessionManagementFilter 11.2. ...

    spring-security源码,直接引用这个压缩文件即可

    ` PersistentTokenBasedRememberMeServices`是一个实现,使用持久化的令牌来实现此功能。 10. **AOP安全拦截**: Spring Security 也提供了基于AOP的安全拦截,可以与Spring的切面编程无缝集成,实现细粒度的访问...

    Spring Security 2.0 中文参考文档

    Remember Me服务允许用户在一段时间内自动登录,通过在客户端存储持久化的认证信息实现。 ### 8. **集成其他框架** Spring Security可以方便地与其他Spring技术(如Spring MVC、Spring Boot)以及非Spring框架(如...

    Spring_Security_权限管理手册_chm中文版

    - 使用Remember-Me服务实现持久化会话,使用户在关闭浏览器后仍能保持登录状态。 - OAuth2和OpenID Connect集成,为现代Web应用提供社交登录功能。 3. **授权模型**: - 角色与权限的概念,以及如何在Spring ...

    spring+security+11种过滤器介绍.doc

    此外,它还可以配合rememberMe服务,清除用户在注销时的持久化身份验证信息,即删除用户cookie。 3. AuthenticationProcessingFilter:这是处理基于表单登录的过滤器,主要负责验证用户名和密码。默认情况下,它...

    如何使用Spring Security手动验证用户的方法示例

    在Spring MVC中,默认情况下,Spring Security 在Spring Security过滤器链中添加了一个额外的过滤器,能够持久化Security 上下文(SecurityContextPersistenceFilter类)。反过来,它将Security 上下文的持久性委托...

    springBoot.zip

    它使用安全的令牌系统来实现持久化的用户认证。 8. **RESTful 安全**:对于 RESTful API,Spring Security 提供了基于 JWT 的认证和授权方案,可以创建和验证 JSON Web Tokens 来安全地传输用户信息。 9. **异常...

    login:使用spring security的登录机制

    这涉及到`PersistentTokenRepository`,它存储用户的持久化token,以便下次用户访问时,系统可以自动完成登录过程。 6. **异常处理**:如果认证或授权失败,Spring Security会抛出相应的异常,你可以通过自定义`...

    springboot-登陆实现和拦截器.zip

    服务器端可能有一个UserDetailsService接口的实现,该接口用于从数据库或任何持久化存储中查找用户信息。如果用户名和密码匹配,Spring Security会生成一个JWT(JSON Web Token)或者使用Spring Session管理用户会话...

    acegi权限控制学习笔记

    在实际应用中,我们可以使用DAO持久化这些信息到数据库中,而不仅仅是在控制台上打印信息。最后,为了使监听器生效,我们需要在Acegi的配置文件中声明这个监听器。 2. 在多个请求之间共享SecurityContext `...

    带登录页面的ssm整合框架

    3. **Mybatis**:Mybatis是一个持久层框架,它提供了方便的SQL映射机制,使得开发者可以直接编写SQL语句,避免了JDBC的繁琐操作。在登录功能中,Mybatis可能被用来查询数据库中的用户信息,与用户输入的登录信息进行...

Global site tag (gtag.js) - Google Analytics