什么是SecurityContextLogoutHandler?
SecurityContextLogoutHandler 是一个实现 LogoutHandler 的处理程序。
SecurityContextLogoutHandler 做什么?
- 它通过修改 SecurityContextHolder 来执行注销。
- 如果 isInvalidateHttpSession() 也会使 HttpSession 无效
为真且会话不为空。
- 它还会从当前的
如果 clearAuthentication 设置为 true(默认),则为 SecurityContext。
SecurityContextHolder 线程安全吗?
是的,默认策略 (MODE_THREADLOCAL) 是线程安全的(只要您不尝试动态更改策略)。但是,如果您希望衍生线程继承父线程的 SecurityContext,则应设置 MODE_INHERITABLETHREADLOCAL。
此外方面没有任何“线程逻辑”,它们与建议的方法在同一个线程中执行。
归功于@axtavt
什么是 Spring Security 中的身份验证?
身份验证: 框架尝试使用提供的凭据来识别最终用户。可以针对插入 Spring Security 的第三方系统进行身份验证。
让我们考虑一个大家都熟悉的标准身份验证场景。
- 系统会提示用户使用用户名和密码登录。
- 系统(成功)验证密码是否正确
用户名。
- 获取该用户的上下文信息(他们的列表
角色等)。
为用户建立安全上下文
用户继续执行某些操作,该操作可能受到访问控制机制的保护,该机制根据当前的安全上下文信息检查操作所需的权限。
前三项构成身份验证过程,因此我们将看看它们是如何在 Spring Security 中发生的。
- 获取用户名和密码并组合成实例
UsernamePasswordAuthenticationToken (的一个实例
身份验证接口,我们之前看到的)。
- 令牌被传递给 AuthenticationManager 的实例
验证。
- AuthenticationManager 返回一个完全填充的身份验证
成功验证的实例。
- 安全上下文是通过调用建立的
SecurityContextHolder.getContext().setAuthentication(...),通过
在返回的身份验证对象中。
SecurityContextPersistentFilter
这个名字很明确。 SecurityContextPersistentFilter 接口的目的是将安全上下文存储在某个存储库中。
为了完成这项任务,过滤器将作业委托给 SecurityContextRepository 接口。
Spring为此接口提供了一个默认实现:org.springframework.security.web.context.HttpSessionSecurityContextRepository。这是不言自明的。安全上下文的存储库就是当前用户 HTTP 会话。
下面是SecurityContextPersistentFilter的XML配置
<!-- Filter to store the Authentication object in the HTTP Session -->
<bean id="securityContextPersistentFilter"
class="org.springframework.security.web.context.SecurityContextPersistenceFilter">
<property name="securityContextRepository" ref="securityContextRepository" />
</bean>
<bean id="securityContextRepository"
class="org.springframework.security.web.context.HttpSessionSecurityContextRepository" />
注销过滤器
LogoutFilter 负责注销当前用户并使安全上下文无效。使 HTTP 会话无效的任务再次委托给另一个参与者 SecurityContextLogoutHandler。
这个处理程序被注入到 LogoutFilter 构造函数中:
<bean id="logoutFilter"
class="org.springframework.security.web.authentication.logout.LogoutFilter">
<constructor-arg value="/pages/Security/logout.html" />
<constructor-arg>
<list>
<bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
</list>
</constructor-arg>
<property name="filterProcessesUrl" value="/j_myApplication_logout"/>
</bean>
<constructor-arg value="/pages/Security/logout.html" /> - 它定义了注销页面的 URL。
SecurityContextLogoutHandler 作为构造函数参数注入<bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
注销操作的 HTML URL 由 <property name="filterProcessesUrl" value="/j_myApplication_logout"/> 处的 filterProcessesUrl 参数定义
资源链接:
- https://doanduyhai.wordpress.com/2012/01/22/spring-security-part-i-configuration-and-security-chain/
- https://doanduyhai.wordpress.com/2012/02/05/spring-security-part-ii-securitycontextpersistentfilter-logoutfilter/
- http://shazsterblog.blogspot.com/2014/02/spring-security-custom-filterchainproxy.html
- http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/context/SecurityContextPersistenceFilter.html