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.根据认证授权信息返回资源给浏览器
使用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.
相关文章推荐
- Java集合ArrayList的应用
- 20145107 《Java程序设计》第五周学习总结
- 使用两个堆栈实现队列功能
- 前端利用ajax后台用struts实现账号唯一性检验
- Arrays.sort()所用插入排序算法
- java文件操作类FILE中的乱码问题
- Struts2的Action访问Spring的业务逻辑组件的两种策略
- javaweb学习
- Spring第一天学习总结
- java chrome ie
- Java中的static Class和non static Class
- Java中的异常处理
- springMVC4(4)json与对象互转实例解析请求响应数据转换器
- Spring.Net学习笔记(6)-方法注入
- java 找出数组中只出现一次的数字
- Java反射——动态加载类
- Java 反射---获取Class的三种方式
- JavaMail 邮件开发
- struts2 中使用request.getInputStream() 获取POST数据
- Struts2核心工作原理解析