您的位置:首页 > 编程语言 > Java开发

springSecurity分离资源服务器分析

2016-04-01 21:34 417 查看
参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/master/vanilla

使用SpringSession实现HttpSession共享,从客户端传过来的Token到资源服务器进行Token解码这种思路简单,实现却不简单的做法在生产上应该不会去应用.主要原理看下图:



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.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: