- 浏览: 190097 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
本文将探讨当web应用中加入的spring security功能时,用户是如何认证的、安全上下文是如何创建的。
环境:
spring boot 版本:1.5.4.RELEASE
1.一个典型的web应用的认证过程如下:
上面中大多数步骤在spring security中都有单独的类负责完成,按照使用的顺序主要有以下参与者
2.ExceptionTranslationFilter
ExceptionTranslationFilter是一个过滤器,负责处理在spring security中抛出的所有异常。这些异常通常情况下都是由最主要的认证服务提供者AbstractSecurityInterceptor所抛出的。这个类我们后面会进一步探讨,现阶段我们只用知道他会产生认证异常就够了,不用去关心他是如何进行认证处理的。ExceptionTranslationFilter会根据产生的异常类型来确定是返回给客户端一个代表拒绝的403码(当用户已经认证过,但是访问了一个他没有权限访问的资源时,上面步骤中的第七步),或者是启动一个AuthenticationEntryPoint(当用户还没有认证时,上面步骤的第三步)
3.AuthenticationEntryPoint
AuthenticationEntryPoint负责上面步骤中的第三步。在有安全控制的web应用中都会有一个默认的认证策略,也都会提供自己的AuthenticationEntryPoint实现来让用户完成认证。
4. AuthenticationManager
一旦浏览器提供了认证的凭证信息(http post请求中的表单信息或者http头信息),服务器端就需要一种机制来收集这些信息,即执行上面步骤中的第六步,这个过程在spring security中叫做认证机制。如基于form的login和Basic认证机制中的http header,当凭证信息收集完成后,具体的认证机制将生成一个Authentication对象,并提供给AuthenticationManager。如果之后凭证信息有效,认证机制会从AuthenticationManager获取一个完全组装好的Authentication对象(包含权限信息),并把Authentication对象存储到SecurityContextHolder中,并重新执行触发认证的原始请求,如果凭证信息不合法,认证机制将要求用户重新认证。
5.另一个核心处理-如何在请求之间存储SecurityContext
在一个典型的web应用中,用户认证一次,他后续的操作将通过对应的session id来标示,不需要每次都认证,服务器负责在一次会话期间缓存这些认证信息。在spring security中这个功能是通过SecurityContextPersistenceFilter来实现的,默认情况下他会把认证信息存储到httpSession的一个属性中,在每一次http请求开始时,这个过滤器都会自动从session中拿出认证的上下文信息存储到SecurityContextHolder中,并且在请求结束后从SecurityContextHolder中把认证信息删除掉(为了安全考虑,确保能执行操作的用户的确是认证过的,并且不是其他人的认证信息)
在有一些web应用中(例如无状态的restful web服务)不使用session机制,因而每次请求都会进行认证,但是我们仍然需要把SecurityContextPersistenceFilter加到过滤器链中,主要就是确保每次请求完成后SecurityContextHolder都会被正确清空。
本文将探讨当web应用中加入的spring security功能时,用户是如何认证的、安全上下文是如何创建的。
环境:
spring boot 版本:1.5.4.RELEASE
1.一个典型的web应用的认证过程如下:
- 用户访问网站主页,点击一个链接
- 一个请求到达服务器,服务器发现用户正在访问一个受保护的资源
- 因为到目前为止,用户还没有认证,所以服务器发回一个响应,指示用户必须先验证,这个响应或者是一个响应码,也可能是直接重定向到登录页
- 根据认证的实现方式不同,用户可能会重定向到登录页等待用户输入用户名、密码等表单信息,或者浏览器以某种方式获取用户的证书(Basic认证中的弹出框,cookies机制,或者如X509认证方式中的证书)
- 浏览器收集到认证信息后,会重新向服务器提交请求,这个请求也根据具体的实现方式而异,即可是一个带着表单信息的http post提交,也可以是http头部信息中包含认证信息详情的简单请求
- 接着,服务器会验证用户提交的认证信息是否合法,如果合法就会执行下一步,如果不合法,通常情况下用户会被提示要重新认证(重新执行上面的两步)
- 最初导致用户进行认证的请求将重新尝试执行。如果用户提供的认证信息有足够的权限访问受保护的资源,则之前的请求就会顺利完成,否则用户将收到一个代表权限不足的响应码:403
上面中大多数步骤在spring security中都有单独的类负责完成,按照使用的顺序主要有以下参与者
- ExceptionTranslationFilter
- AuthenticationEntryPoint
- AuthenticationManager
2.ExceptionTranslationFilter
ExceptionTranslationFilter是一个过滤器,负责处理在spring security中抛出的所有异常。这些异常通常情况下都是由最主要的认证服务提供者AbstractSecurityInterceptor所抛出的。这个类我们后面会进一步探讨,现阶段我们只用知道他会产生认证异常就够了,不用去关心他是如何进行认证处理的。ExceptionTranslationFilter会根据产生的异常类型来确定是返回给客户端一个代表拒绝的403码(当用户已经认证过,但是访问了一个他没有权限访问的资源时,上面步骤中的第七步),或者是启动一个AuthenticationEntryPoint(当用户还没有认证时,上面步骤的第三步)
3.AuthenticationEntryPoint
AuthenticationEntryPoint负责上面步骤中的第三步。在有安全控制的web应用中都会有一个默认的认证策略,也都会提供自己的AuthenticationEntryPoint实现来让用户完成认证。
4. AuthenticationManager
一旦浏览器提供了认证的凭证信息(http post请求中的表单信息或者http头信息),服务器端就需要一种机制来收集这些信息,即执行上面步骤中的第六步,这个过程在spring security中叫做认证机制。如基于form的login和Basic认证机制中的http header,当凭证信息收集完成后,具体的认证机制将生成一个Authentication对象,并提供给AuthenticationManager。如果之后凭证信息有效,认证机制会从AuthenticationManager获取一个完全组装好的Authentication对象(包含权限信息),并把Authentication对象存储到SecurityContextHolder中,并重新执行触发认证的原始请求,如果凭证信息不合法,认证机制将要求用户重新认证。
5.另一个核心处理-如何在请求之间存储SecurityContext
在一个典型的web应用中,用户认证一次,他后续的操作将通过对应的session id来标示,不需要每次都认证,服务器负责在一次会话期间缓存这些认证信息。在spring security中这个功能是通过SecurityContextPersistenceFilter来实现的,默认情况下他会把认证信息存储到httpSession的一个属性中,在每一次http请求开始时,这个过滤器都会自动从session中拿出认证的上下文信息存储到SecurityContextHolder中,并且在请求结束后从SecurityContextHolder中把认证信息删除掉(为了安全考虑,确保能执行操作的用户的确是认证过的,并且不是其他人的认证信息)
在有一些web应用中(例如无状态的restful web服务)不使用session机制,因而每次请求都会进行认证,但是我们仍然需要把SecurityContextPersistenceFilter加到过滤器链中,主要就是确保每次请求完成后SecurityContextHolder都会被正确清空。
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1559前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81331.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1299前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1771前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1205一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1074一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2004前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2275前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12151.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7814前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2352前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1188前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1443前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1378前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2506前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2069前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 841前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2038前言: SSO英文全称Single Sign On,单点登 ... -
spring-security(七)java config-sample之concurrency
2018-02-15 10:51 644前言: 在实际应用中,我们可能会限制一个用户同时登录同一个 ...
相关推荐
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
Web - spring-security-web.jar 1.4.1.3. Config - spring-security-config.jar 1.4.1.4. LDAP - spring-security-ldap.jar 1.4.1.5. ACL - spring-security-acl.jar 1.4.1.6. CAS - spring-security-cas-...
9.3.1什么是Spring Security中的认证? 78 9.3.2直接设置SecurityContextHolder内容 80 9.4 Web应用程序中的身份验证 81 9.4.1 ExceptionTranslationFilter 82 9.4.2 AuthenticationEntryPoint 82 9.4.3认证机制 82 ...
Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...
5.4. 在web应用中验证 5.4.1. ExceptionTranslationFilter 5.4.2. AuthenticationEntryPoint 5.4.3. 验证机制 5.4.4. 在请求之间保存SecurityContext 。 5.5. Spring Security中的访问控制(验证) ...
spring-security-pac4j项目是一个用于Spring Security Web应用程序和Web服务(带有或不带有Spring Boot)的简单而强大的安全性库。 它支持身份验证和授权,还支持会话固定和CSRF保护等高级功能。 它基于Java 8,...
5.4. 在web应用中验证 5.4.1. ExceptionTranslationFilter 5.4.2. AuthenticationEntryPoint 5.4.3. 验证机制 5.4.4. 在请求之间保存SecurityContext。 5.5. Spring Security中的访问控制(验证) 5.5.1. 安全...
#本实例演示了spring security 多重认证(网页认证和httpBasic认证) ##1、网页认证适合于网页类应用; ##2、httpBasic认证适合API类(web service)应用; ###API保活访问采用cookie方式: curl -H "Cookie:SESSION...
使用 Spring Security 进行 JTechLog 预认证该程序是 JTechLog ( ) 博客上“使用 Spring Security 进行预身份验证”帖子的示例程序。 出示容器提供的授权,然后将登录结果与 Spring Security 一起使用。 具有 JPA ...
spring-webmvc-pac4j项目是一个用于Spring Web MVC / Spring Boot Web应用程序和Web服务的简单而强大的安全性库。 它支持身份验证和授权,还支持注销和会话固定和CSRF保护等高级功能。 它基于Java 8,Spring Web MVC...
应用程序类型->“ Web应用程序”, 授权的Javascript来源->“”, 授权重定向URI-> 复制客户端ID和客户端密钥并更新application.yml 2.要运行此应用程序,请使用: mvn spring-boot:run ### 3。 打开浏览器并...
包含实现Web应用程序安全功能的组件 弹簧安全配置 由组件组成,以支持每个模块提供的组件配置(支持基于Java的配置方法的类或解释XML名称空间的类,等等。) Spring安全标签库 包含JSP标记库以使用认证信息或授权...
在Web应用开发中,安全一直是非常重要的一个方面。Spring Security基于Spring 框架,提供了一套Web应用安全性的完整解决方案。
一般Web应用的需要进行认证和授权。 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 授权:经过认证后判断当前用户是否有权限进行某个操作 而认证和授权也是SpringSecurity...
响应式Spring Security 5研讨会这是一个动手实践研讨会,内容涉及使用Spring Security 5.x保护基于响应式Spring Boot 2.x的Web应用程序。介绍话题该研讨会将涉及的主题是: 使用和基本概念(即安全性Web筛选器链) ...
SpringSecurity 特点 和 Spring 无缝整合 全面的权限控制 专门为 Web 开发而设计 旧版本不能脱离 Web 环境使用 新版本中对整个框架进行了分层抽取,分成了核心模块和 Web 模块,单独引入核心模块就可以脱离 Web 环境...
一般Web应用的需要进行认证和授权。 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户 授权:经过认证后判断当前用户是否有权限进行某个操作 而认证和授权也是SpringSecurity作为安全...
身份验证:Spring Security支持多种身份验证方式,包括基本认证、表单登录、LDAP认证、OAuth等,同时也支持自定义的认证方式。 授权:Spring Security提供了细粒度的授权机制,可以根据角色、权限进行访问控制。...
Spring Security框架介绍 ...Spring Security与Web应用安全 Spring Security用户认证流程 Spring Security用户授权管理 Spring Security与Spring集成 Spring Security最佳实践 Spring Security安全漏洞与防范
安全一直是 ...Security为使用Spring框架的Web应用提供了良好的支持。本文将详细介绍如何使用Spring Security框架为Web应用提供安全支持。在Web应用开发中,安全一直是非常重要的一个方面。安全虽然属于