springSecurity分离资源服务器分析

参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/master/vanilla
使用SpringSession实现HttpSession共享,从客户端传过来的Token到资源服务器进行Token解码这种思路简单,实现却不简单的做法在生产上应该不会去应用.主要原理看下图:
springSecurity分离资源服务器分析_第1张图片
1.浏览器向UI服务器进行认证授权
2.将认证授权信息存储在Redis服务器
3.浏览器从UI获取Token(实际就是sessionId)
4.浏览器发送Token到Resource服务器获取资源
5.Resource服务器根据Token向Redis服务器获取认证授权信息
6.根据认证授权信息返回资源给浏览器

关键点分析:

在org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration#springSessionRepositoryFilter注册springSessionRepositoryFilter Bean时会使用在demo.ResourceApplication#sessionStrategy注册的HeaderHttpSessionStrategy Bean.HeaderHttpSessionStrategy Bean会被注入到springSessionRepositoryFilter Bean的httpSessionStrategy属性.

在org.springframework.session.web.http.SessionRepositoryFilter声明了SessionRepositoryRequestWrapper内部类,spring security在这里对HttpSession进行了再封装.于是在调用getSession方法,会根据httpSessionStrategy去取sessionId(常见有CookieHttpSessionStrategy和HeaderHttpSessionStrategy).

当发送请求时,会被一系列的拦截器拦截(看org.springframework.security.web.FilterChainProxy.VirtualFilterChain#doFilter),直到这个Filter为SecurityContextPersistenceFilter时,调到doFilter的SecurityContext contextBeforeChainExecution = repo.loadContext(holder);这里就会触发getSession方法.得到Session后就可以得到认证授权信息.

从UI服务器返回的响应,再次以ajax方式向Resource服务器发请求,这里就发生了跨域问题,对跨域问题,spring 4.2开始,得到了较好的支持.

发送Token是以请求头的方式发送到资源服务器的,里面还介绍了为什么不用cookie.

你可能感兴趣的:(security)