`
zm2011
  • 浏览: 38506 次
社区版块
存档分类
最新评论

根据web提交的过滤器链

阅读更多
spring security从2.0开始,在配置文件中只需配置一个<security:http>命名空间就可以代表一个FilterChainProxy过滤器链,而不用明确的配置出。
org.springframework.security.web.FilterChainProxy维持了一个过滤器链,并用一个currentPosition控制依次执行以下过滤器(spring security3.0.7)。


org.springframework.security.web.session.ConcurrentSessionFilter,
处理session并发。首先判断该访问对应的session是不是第一次访问,如果是第一次访问则SessionInformation为null则过滤链向下进行,如果不是第一次访问则判断此session的标记是不是已过期如果过期则执行推出操作,如果未过期则更行session的访问时间过滤链继续执行。
这个过滤器执行两个方法。首先,它对所有的请求调用org.springframework.security.core.session.SessionRegistry的refreshLastRequest(sessionId)方法,更新已经创建的session的最后请求的时间。然后为每个请求从SessionRegistry重新得到org.springframework.security.core.session.SessionInformation,然后判断这个session是否已经到期。如果已经到期,则会调用org.springframework.security.web.authentication.logout.LogoutFilter销毁这个session,然后重定向一个session无效的URL。这个类主要是判断session是否失效。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
	
        HttpSession session = request.getSession(false);

        if (session != null) {
            SessionInformation info = sessionRegistry.getSessionInformation(session.getId());

            if (info != null) {
                if (info.isExpired()) {
                    // Expired - abort processing
                    doLogout(request, response);

                    String targetUrl = determineExpiredUrl(request, info);

                    if (targetUrl != null) {
                        redirectStrategy.sendRedirect(request, response, targetUrl);

                        return;
                    } else {
                        response.getWriter().print("This session has been expired (possibly due to multiple concurrent " +
                                "logins being attempted as the same user).");
                        response.flushBuffer();
                    }

                    return;
                } else {
                    // Non-expired - update last request date/time
                    sessionRegistry.refreshLastRequest(info.getSessionId());
                }
            }
        }

        chain.doFilter(request, response);




org.springframework.security.web.context.SecurityContextPersistenceFilter
FILTER_APPLIED属性用于确保此过滤器每次访问只执行一次。此类用于每次过滤器链执行时提供一个SecurityContext放入SecurityContextHolder进行验证。
在请求到来之前从SecurityContextRepository获得SecurityContext存到SecurityContextHolder之中。在请求完毕或清空context holder时再存回SecurityContext仓库。默认是使用一个HttpSessionSecurityContextRepository。这个过滤器在每一次请求只执行一次,解决servlet容器的兼容(特别是Weblogic)。
这个过滤器必须在所有的认证处理机制前执行。因为认证处理机制(BASIC、CAS处理过滤器等)执行时会认为SecurityContextHolder包含一个有效的SecurityContext。
forceEagerSessionCreation属性用于去确定一个session在过滤器链执行前都是可用的。默认是false,因为这是资源密集型的,不推荐

org.springframework.security.web.authentication.logout.LogoutFilter
判断请求rui是不是以j_spring_security_logout结尾,如果是的话就调用logouthandle进行退出操作。一系列的LogoutHandler进行投票,这些投票的顺序应该被规定的。通常需要调用TokenBasedRememberMeServices和SecurityContextLogoutHandler。当退出成功后,根据构造方法调用LogoutSuccessHandler或logoutSuccessUrl进行重定向。

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
此类继承于org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter这个抽象认证处理过滤器类用于处理基于HTTP浏览器的请求认证。
这个抽象类需要判定请求的uri是不是以j_spring_security_check结尾,如果是的话就进行认证处理,如果不是的话就往下执行。
UsernamePasswordAuthenticationFilter的attemptAuthentication()方法用户认证处理,并且不支持POST提交认证。
将获得的用户名和密码封装为一个org.springframework.security.authentication.UsernamePasswordAuthenticationToken类,此类是Authentication的一个子类,用于将用户名和密码进行简单的封装。然后将用户名存于session中,其key是SPRING_SECURITY_LAST_USERNAME
调用authenticationManager(org.springframework.security.authentication. ProviderManager)中调用配置文件中的认证管理器进行认证。


处理表单提交认证。在spring security3.0是调用AuthenticationProcessingFilter
登录表单必须向此过滤器提供两个参数:用户名和密码。默认的用户名和密码的名字在SPRING_SECURITY_FORM_USERNAME_KEY和SPRING_SECURITY_FORM_PASSWORD_KEY 设定好了。可以通过usernameParameter和passwordParameter修改。
这个过滤器默认对URL(/j_spring_security_check)响应。


org.springframework.security.web.authentication.www.BasicAuthenticationFilter

表单登录此过滤器不执行。

org.springframework.security.web.savedrequest.RequestCacheAwareFilter
在RequestCache查找是否有已存储的和此次访问相同的request如果有则把存储的request传入doFilter方法。

org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
这个过滤器通过一个被包装的request构成ServletRequest。org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper中根据传入的角色前缀验证request中的Authentication有没有角色访问权限

org.springframework.security.web.authentication.AnonymousAuthenticationFilter
匿名登录过滤器,检查SecurityContextHolder中有没有Authentication,如果没有则创建一个AnonymousAuthenticationToken。
org.springframework.security.web.session.SessionManagementFilter
检查访问开始时此用户是否已被授权,如果已被授权则执行session相关的激活,比如并发登录。

org.springframework.security.web.access.ExceptionTranslationFilter
处理过滤器链中所有的拒绝访问异常和认证异常。这个过滤器是java异常和http 响应之间的一个桥梁,它是唯一和维护用户接口有关的。这个过滤器不执行任何和安全相关的处理。如果一个认证异常被探测到。这个过滤器将加载authenticationEntryPoint,这将处理任何从org.springframework.security.access.intercept.AbstractSecurityInterceptor子类的认证异常。
如果拒绝访问异常被检查到。过滤器将检查这个用户是不是匿名用户。如果是个匿名用户则加载authenticationEntryPoint。如果不是匿名用户,过滤器将转到org.springframework.security.web.access.AccessDeniedHandler默认是加载org.springframework.security.web.access.AccessDeniedHandlerImpl


org.springframework.security.web.access.intercept.FilterSecurityInterceptor

调用org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource进行验证。这个类并不会执行到验证的行就被返回了。所以这个类实质上并没有进行验证。



分享到:
评论

相关推荐

    Web作业(jsp代码来自老师,其他是由本人编写,希望对你们有帮助)

    在数据库中建立表T_BOOK,它包含图书ID、...编写一个应用,在登录页面中让用户选择“是否保存登录状态”,如果保存,后面用户访问各个页面时由过滤器来进行Cookie检查,如果Cookie检查通过验证,则直接跳转到欢迎页面。

    Web Services 教程

    JSON 解析器 47 XQuery 教程 48 XQuery 参考手册 48 内容目录 48 XQuery 简介 49 您应该具备的基础知识: 49 什么是 XQuery? 49 XQuery 和 XML 查询有关 50 XQuery 与 XPath 50 XQuery - 应用举例 50 XQuery 是一个 ...

    dev_test:WEB开发测试

    dev_test WEB开发测试 项目名称WEB开发测试 说明WEB应用程序接受经过JavaScript和PhP验证的电子邮件... 顶部有按电子邮件发送的过滤器按钮,搜索在底部。 在Windows 10上开发的依赖项WEB应用程序 作者阿蒂斯(Artis)

    LNC Web rb.cz eKonto-crx插件

    - 用户可以使用Enter键提交事务列表过滤器,无需单击“确定”按钮我们产品的功能: - 所需权限的数量减少到最小值。 - 定期检查产品,以便与网站和Web浏览器保持兼容 - 找到兼容性问题时会及时更新产品 - 产品不断...

    LNC网站rb.cz eKonto「LNC Web rb.cz eKonto」-crx插件

    LNC Web rb.cz eKonto是一个浏览器扩展,可以极大地改善rb.cz eKonto网站的浏览,使用和功能特点:-向交易列表添加了“用作模板”链接-删除了交易列表过滤器中的日期范围限制-限制交易清单过滤器中“日期”输入中的...

    deviantART-Filter:一个浏览器扩展,允许您按用户、关键字或类别过滤 DeviantArt

    功能齐全的管理面板,用于维护您的过滤器和控制功能。 从任何偏差缩略图或链接快速创建过滤器。 按标题和/或标签中的关键字过滤偏差(支持通配符)。 过滤与特定类别的所有偏差。 导入和导出过滤器列表,便于...

    Grails 中文参考手册

    6.6.3 过滤器的功能 6.7 Ajax 6.7.1 用Prototype实现Ajax 6.7.1.1 异步链接 6.7.1.2 更新内容 6.7.1.3 异步表单提交 6.7.1.4 Ajax事件 6.7.2 用Dojo实现Ajax 6.7.3 用GWT实现Ajax 6.7.4 服务端的Ajax 6.8 内容协商 7...

    精通AngularJS part1

    针对日期、数字和货币的自定义过滤器285 104小结287 第11章开发健壮的AngularJS应用289 111理解AngularJS的内部运作机制290 AngularJS不是基于字符串的模板引擎290 响应DOM事件更新模型291 将模型变化传播给...

    pantopoda:快速高效的网络蜘蛛,使用bloom过滤器访问给定域中的所有链接,以存储访问的链接和多个线程以实现并发

    Pantopoda是一个Ruby蜘蛛库,它由于缺乏Python所拥有的优秀的,现代的Web爬行工具而完全出于沮丧而构建。 Pantopoda使用Bloom筛选器来存储访问的URL列表,以高效地查询多达数十万个URL,而请求由Typhoeus处理以允许...

    驰志超级留言本

    10、可灵活配置的禁用词过滤器 11、防止同一用户多次提交 12、通过检查 Session ID 杜绝远程恶意提交 13、允许管理员审核留言后再显示 14、可设置允许用户填写主页链接和 E-mail 地址 15、后台管理账户及密码...

    afrlreq:Web的非洲语言支持

    •• (带有afrlreq过滤器)• 文件资料 ••• N'Ko Gap分析•编辑草稿•最新提交•在Github上进行编辑/评论 反馈 请使用GitHub问题列表报告问题,以提供语言支持,进行讨论并发送有关文档的反馈。 (了解GitHub...

    Luuk.gg:这是如何构建复杂的Web应用程序的示例

    仪表盘显示显示每个页面的详细描述职业实现和 显示我所做的代码贡献数量显示带有我工作过的地方的标记的世界地图烹饪实现和 显示带有过滤器和排序选项的配方列表用户登录后可以提交新食谱信使实现和 用户可以实时与...

    sealreq:东南亚布局工作队

    •• (带有sealreq过滤器)• 文件资料 ••• ••最新提交 Thai Gap分析•编辑草稿•最新提交•在GitHub上进行编辑/评论 泰语版式要求•编辑草稿•最新提交 高棉差距分析•编辑草稿•最新提交•在GitHub上进行...

    iip:在网络和电子书中记录支持印度语的差距和要求

    ••(带有ilreq过滤器)• 文件资料 ••• ••最新提交 Devanagari差距分析•编辑草稿•最新提交•在GitHub上进行编辑/评论 Devanagari布局要求•编辑草稿•最新提交 古吉拉特语差距分析•编辑草稿•最新提交•在...

    eurlreq:欧洲语言支持

    •• (带有eurlreq过滤器)•。 文件资料 ••• ••最新提交•在GitHub上进行编辑/评论 格鲁吉亚差距分析•编辑草稿•最新提交•在GitHub上进行编辑/评论 德语差距分析•编辑草稿•最新提交•在GitHub上进行编辑/...

    第三代移动WEB内核小程序风口-逐浪CMS2 x3.9.3全面发布

    ■安全:增加AntiXSS插件,专用于处理用户提交的HTML,过滤危险标签 ■修复:商品修改,精品属性丢失Bug ■安全:增强了底层标签模块的安全检测 ■扩展:地图字段,简洁--完全版支持互转 ■增加:扩展虚拟币支持图片凭证 ...

    django-docs-2.2-zh-hans.zip

    对于设计者: 语法概述 | 内建标签及过滤器(filters) | 人性化 针对程序员: 模板 API | 自定义标签(tags)和过滤器(filters) 表单 Django 提供了一个丰富的框架来帮助创建表单和处理表单数据。 基础: 概览 | 表单 ...

    amlreq:启用美洲语言的网络

    •• (带有amlreq过滤器)• 文件资料 ••• ••最新提交•在GitHub上进行编辑/评论 Osage差距分析•编辑草稿•最新提交•在GitHub上进行编辑/评论 反馈 请使用GitHub问题列表报告问题,以提供语言支持,进行...

Global site tag (gtag.js) - Google Analytics