当前位置: 首页>編程日記>正文

反向代理分离资源服务器分析

反向代理分离资源服务器分析

参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/proxy/README.adoc
和前文相似,使用SpringSession实现HttpSession共享,UI服务器同时是反向代理服务器,根据需求将请求转发到资源服务器,这里同时将请求头转发,资源服务器从请求头得到Token,进行Token解码,得到认证授权信息.这种思路省去了跨域问题.主要原理看下图:
原理图
1.浏览器向UI服务器进行认证授权
2.将认证授权信息存储在Redis服务器
3.浏览器向UI服务器发出请求
4.UI服务器将请求转发到资源服务器
5.Resource服务器从请求头得到Token,向Redis服务器获取认证授权信息
最后返回资源到UI服务器,再返回资源给浏览器.

使用spring要创建一个反向代理是件简单的事情.
1.加入pom.xml

 <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Angel.SR6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zuul</artifactId></dependency><dependencies>

2.在application.yml配置路由映射信息

zuul:routes:resource:path: /resource/**url: http://localhost:9000

3.在主应用类加入注解@EnableZuulProxy,启动就可以测试了.这种思路可以解决上节的跨域问题.

上面是不需要权限控制的代理服务器配置,如果要进行权限控制,还要往下走:
1.在在UI服务器和Resource服务器都配置spring session.
2.在UI服务器加入以下配置,意思是转发时,同时转发请求头,

zuul:routes:resource:sensitive-headers:

3.在Resource服务器加入安全控制,禁止弹出认证对话框.@SpringBootApplication

public class ResourceApplication extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.httpBasic().disable();http.authorizeRequests().anyRequest().authenticated();}}

同时,资源服务器没必要创建session,在application.properties加入
security.sessions: NEVER

security session创建策略详解:
如果使用了spring boot,spring boot自带一套HttpSecurity配置:

@Autowired
private SecurityProperties security;
org.springframework.boot.autoconfigure.security.SpringBootWebSecurityConfiguration.ApplicationWebSecurityConfigurerAdapter#configure{
http.sessionManagement().sessionCreationPolicy(this.security.getSessions());
}

spring boot自带的这套HttpSecurity配置,很明显它从SecurityProperties里去取,如果没有在application.properties配置,那么它的默认值就是STATELESS,security不会去创建session.如果在application.properties配置了值,当然是配置的值.
如果我们有需求要覆盖这套HttpSecurity配置(一般都要覆盖),覆盖的原理参考

org.springframework.security.web.FilterChainProxy#getFilters(javax.servlet.http.HttpServletRequest){for (SecurityFilterChain chain : filterChains) {if (chain.matches(request)) {return chain.getFilters();}}return null;
}

主要看filterChains,如果配了两套HttpSecurity,filterChains至少会各自对应一个SecurityFilterChain(可能配置忽略Url,就会再多几个SecurityFilterChain),上面的方法是如果匹配,就直接从SecurityFilterChain拿到里面的Filters返回.这段代码会先涉及到:1是否匹配,只有匹配才会从里面取Filter;2.谁先匹配,就先从它那里取Filter.知道这两点,spring boot自带的那套HttpSecurity产生的SecurityFilterChain没有做路径排除,就会匹配所有路径,要想从其它的HttpSecurity产生的SecurityFilterChain拿Filter,就要让这个SecurityFilterChain装在filterChains的前面.
解决方法:因为spring boot自带的org.springframework.boot.autoconfigure.security.SpringBootWebSecurityConfiguration.ApplicationWebSecurityConfigurerAdapter上有@Order(SecurityProperties.BASIC_AUTH_ORDER),那么我们自定义的WebSecurityConfigurerAdapter的order比它小就可以了,比如使用@Order(SecurityProperties.BASIC_AUTH_ORDER-1)或使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)也好.

@Override
public void configure(HttpSecurity http) throws Exception {}

重写的这个方法,如果没有使用http.sessionManagement().sessionCreationPolicy(this.security.getSessions());,那么application.properties配置什么值都没用,因为它不会自动用上,它的默认值就是org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer#sessionPolicy的默认值SessionCreationPolicy.IF_REQUIRED;
对于security session的几个值的详细意义就参考org.springframework.security.config.http.SessionCreationPolicy的API文档.
了解这些,对于有时你想创建session的情况,你却设置了不创建session,可能你就无法登录.对于使用了oauth,客户端解token,就无必要创建session.后面使用jwt,也没必要创建session.因为可以使用jwt的无状态认证机制,服务端可以不创建session认证信息.


https://www.fengoutiyan.com/post/15440.html

相关文章:

  • 反向代理服务器的作用
  • 反向代理解决跨域问题
  • 把服务器加入到域什么意思
  • 反向代理原理
  • 服务器反向代理
  • 什么叫反向代理服务器
  • 服务器数据库分离
  • 服务器域要和用户域分离吗
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機