WebSecurityConfiguration.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package com.shkpr.service.proxycenter.configuration;
  2. import com.global.base.tools.EncryptionUtil;
  3. import com.global.base.tools.RandomUtil;
  4. import com.shkpr.service.proxycenter.components.*;
  5. import com.shkpr.service.proxycenter.constants.ProxyPassDefine;
  6. import com.shkpr.service.proxycenter.controllerfilter.CustomAuthenticationProvider;
  7. import com.shkpr.service.proxycenter.controllerfilter.SelfBizFilterMgr;
  8. import com.shkpr.service.proxycenter.globalcache.GlobalData;
  9. import org.mitre.dsmiley.httpproxy.ProxyServlet;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.boot.context.properties.ConfigurationProperties;
  12. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  13. import org.springframework.context.annotation.Bean;
  14. import org.springframework.context.annotation.Configuration;
  15. import org.springframework.context.annotation.Primary;
  16. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  17. import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
  18. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  19. import org.springframework.security.config.annotation.web.builders.WebSecurity;
  20. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  21. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  22. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
  23. import javax.annotation.PostConstruct;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. /**
  27. * 该类主要用来做权限控制的配置、以及注册各种过滤器
  28. * 执行顺序
  29. * (1) 注册验证组件 - configure(AuthenticationManagerBuilder auth)方法中注册自定义验证组件
  30. * (2) 设置验证规则 - configure(HttpSecurity http)方法中设置了各种路由访问规则
  31. * (3) 初始化过滤组件 - JWTLoginFilter 和 SelfAuthenticationFilter 类会初始化
  32. */
  33. @Configuration
  34. @EnableWebSecurity
  35. @EnableGlobalMethodSecurity(prePostEnabled = true) //@PreAuthorize对权限的注解需要设置prePostEnabled = true
  36. @ConfigurationProperties(prefix = "atuocfg")
  37. public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
  38. @Value("${global.test.pressure:false}")
  39. private boolean mBForPressureTest;
  40. @Value("${global.ops.lan.ip:127.0.0.1}")
  41. private String mStrOpsServerLanIP;
  42. private Map<String, String> proxyToAddress = new HashMap<>();
  43. private Map<String, String> proxyToPassword = new HashMap<>();
  44. private Map<String, String> proxyToUri = new HashMap<>();
  45. public Map<String, String> getProxyToAddress() {
  46. return proxyToAddress;
  47. }
  48. public void setProxyToAddress(Map<String, String> proxyToAddress) {
  49. this.proxyToAddress = proxyToAddress;
  50. }
  51. public Map<String, String> getProxyToPassword() {
  52. return proxyToPassword;
  53. }
  54. public void setProxyToPassword(Map<String, String> proxyToPassword) {
  55. this.proxyToPassword = proxyToPassword;
  56. }
  57. public Map<String, String> getProxyToUri() {
  58. return proxyToUri;
  59. }
  60. public void setProxyToUri(Map<String, String> proxyToUri) {
  61. this.proxyToUri = proxyToUri;
  62. }
  63. @Override
  64. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  65. //使用自定义身份验证组件
  66. auth.authenticationProvider(new CustomAuthenticationProvider());
  67. }
  68. // 设置 HTTP 验证规则
  69. @Override
  70. protected void configure(HttpSecurity http) throws Exception {
  71. String[] arrOpsServerLanIPs = mStrOpsServerLanIP.split(";");
  72. String strAccessFilterForOps = "hasIpAddress('127.0.0.1')";
  73. for (String strTmp:arrOpsServerLanIPs){
  74. strAccessFilterForOps += " or hasIpAddress('"+ strTmp +"')";
  75. }
  76. http.csrf().disable() // 关闭csrf验证
  77. .authorizeRequests() // 对请求进行认证
  78. //.antMatchers(ApiURI.URI_BASE_PROXY_XXX).permitAll()
  79. .antMatchers("/**").permitAll()
  80. .anyRequest().authenticated()
  81. .and()
  82. .addFilterBefore(new SelfBizFilterMgr("/**", authenticationManager()),
  83. UsernamePasswordAuthenticationFilter.class); //所有其他请求需要身份认证;
  84. /*.addFilterBefore(new ServerStatusMonitorFilter(ThirdApiURI.URI_HGAS_MONITOR_XXX, authenticationManager()),
  85. UsernamePasswordAuthenticationFilter.class);*/
  86. }
  87. @Override
  88. public void configure(WebSecurity web) throws Exception {
  89. /*web.ignoring()
  90. .antMatchers("/error")
  91. .antMatchers("/static")
  92. .antMatchers("/static/**"); // 所有/static下的静态资源请求时都忽略访问规则
  93. */
  94. }
  95. @Bean(name = ProxyPassDefine.PROXY_BASE)
  96. @Primary
  97. public ServletRegistrationBean<BaseASProxyServlet> servletServletRegistrationForBase() {
  98. ServletRegistrationBean<BaseASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  99. servletRegistrationBean.setServlet(new BaseASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_BASE)
  100. , ProxyPassDefine.PROXY_BASE
  101. , proxyToAddress.get(ProxyPassDefine.PROXY_BASE)
  102. , EncryptionUtil.MD5Hash(proxyToPassword.getOrDefault(ProxyPassDefine.PROXY_BASE, RandomUtil.getRandomStr(8)))));
  103. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_BASE), "*"));
  104. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  105. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  106. return servletRegistrationBean;
  107. }
  108. @Bean(name = ProxyPassDefine.PROXY_TASK)
  109. public ServletRegistrationBean<TaskASProxyServlet> servletServletRegistrationForTask() {
  110. ServletRegistrationBean<TaskASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  111. servletRegistrationBean.setServlet(new TaskASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_TASK)
  112. , ProxyPassDefine.PROXY_TASK
  113. , proxyToAddress.get(ProxyPassDefine.PROXY_TASK)
  114. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_TASK, RandomUtil.getRandomStr(8)))));
  115. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_TASK), "*"));
  116. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  117. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  118. return servletRegistrationBean;
  119. }
  120. @Bean(name = ProxyPassDefine.PROXY_AI_MODEL)
  121. public ServletRegistrationBean<AIModelASProxyServlet> servletServletRegistrationForAIModel() {
  122. ServletRegistrationBean<AIModelASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  123. servletRegistrationBean.setServlet(new AIModelASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_AI_MODEL)
  124. , ProxyPassDefine.PROXY_AI_MODEL
  125. , proxyToAddress.get(ProxyPassDefine.PROXY_AI_MODEL)
  126. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_AI_MODEL, RandomUtil.getRandomStr(8)))));
  127. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_TASK), "*"));
  128. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  129. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  130. return servletRegistrationBean;
  131. }
  132. @Bean(name = ProxyPassDefine.PROXY_GW)
  133. public ServletRegistrationBean<DataGWASProxyServlet> servletServletRegistrationForDataGW() {
  134. ServletRegistrationBean<DataGWASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  135. servletRegistrationBean.setServlet(new DataGWASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_GW)
  136. , ProxyPassDefine.PROXY_GW
  137. , proxyToAddress.get(ProxyPassDefine.PROXY_GW)
  138. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_GW, RandomUtil.getRandomStr(8)))));
  139. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_GW), "*"));
  140. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  141. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  142. return servletRegistrationBean;
  143. }
  144. @Bean(name = ProxyPassDefine.PROXY_GIS)
  145. public ServletRegistrationBean<GisAEASProxyServlet> servletServletRegistrationForGisAe() {
  146. ServletRegistrationBean<GisAEASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  147. servletRegistrationBean.setServlet(new GisAEASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_GIS)
  148. , ProxyPassDefine.PROXY_GIS
  149. , proxyToAddress.get(ProxyPassDefine.PROXY_GIS)
  150. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_GIS, RandomUtil.getRandomStr(8)))));
  151. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_GIS), "*"));
  152. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  153. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  154. return servletRegistrationBean;
  155. }
  156. @Bean(name = ProxyPassDefine.PROXY_STATS)
  157. public ServletRegistrationBean<IotStatsASProxyServlet> servletServletRegistrationForIotStats() {
  158. ServletRegistrationBean<IotStatsASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  159. servletRegistrationBean.setServlet(new IotStatsASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_STATS)
  160. , ProxyPassDefine.PROXY_STATS
  161. , proxyToAddress.get(ProxyPassDefine.PROXY_STATS)
  162. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_STATS, RandomUtil.getRandomStr(8)))));
  163. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_STATS), "*"));
  164. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  165. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  166. return servletRegistrationBean;
  167. }
  168. @Bean(name = ProxyPassDefine.PROXY_OLD_STATS)
  169. public ServletRegistrationBean<IotStatsOldProxyServlet> servletServletRegistrationForOldIotStats() {
  170. ServletRegistrationBean<IotStatsOldProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  171. servletRegistrationBean.setServlet(new IotStatsOldProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_OLD_STATS)
  172. , ProxyPassDefine.PROXY_OLD_STATS
  173. , proxyToAddress.get(ProxyPassDefine.PROXY_OLD_STATS)
  174. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_OLD_STATS, RandomUtil.getRandomStr(8)))));
  175. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_OLD_STATS), "*"));
  176. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  177. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  178. return servletRegistrationBean;
  179. }
  180. @Bean(name = ProxyPassDefine.PROXY_PUSH)
  181. public ServletRegistrationBean<PushASProxyServlet> servletServletRegistrationForPush() {
  182. ServletRegistrationBean<PushASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  183. servletRegistrationBean.setServlet(new PushASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_PUSH)
  184. , ProxyPassDefine.PROXY_PUSH
  185. , proxyToAddress.get(ProxyPassDefine.PROXY_PUSH)
  186. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_PUSH, RandomUtil.getRandomStr(8)))));
  187. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_PUSH), "*"));
  188. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  189. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  190. return servletRegistrationBean;
  191. }
  192. @Bean(name = ProxyPassDefine.PROXY_ANALY)
  193. public ServletRegistrationBean<AnalyASProxyServlet> servletServletRegistrationForAnaly() {
  194. ServletRegistrationBean<AnalyASProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  195. servletRegistrationBean.setServlet(new AnalyASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_ANALY)
  196. , ProxyPassDefine.PROXY_ANALY
  197. , proxyToAddress.get(ProxyPassDefine.PROXY_ANALY)
  198. , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_ANALY, RandomUtil.getRandomStr(8)))));
  199. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_ANALY), "*"));
  200. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  201. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  202. return servletRegistrationBean;
  203. }
  204. @Bean(name = ProxyPassDefine.PROXY_GEOSERVER)
  205. public ServletRegistrationBean<GeoServerProxyServlet> servletServletRegistrationForGeoServer() {
  206. ServletRegistrationBean<GeoServerProxyServlet> servletRegistrationBean = new ServletRegistrationBean<>();
  207. servletRegistrationBean.setServlet(new GeoServerProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_GEOSERVER)
  208. , ProxyPassDefine.PROXY_GEOSERVER
  209. , proxyToAddress.get(ProxyPassDefine.PROXY_GEOSERVER)
  210. , proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_ANALY, RandomUtil.getRandomStr(8))));
  211. servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_GEOSERVER), "*"));
  212. servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false");
  213. servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000");
  214. return servletRegistrationBean;
  215. }
  216. @PostConstruct
  217. public void init(){
  218. GlobalData.getInstance().initProxyToAddress(proxyToAddress);
  219. GlobalData.getInstance().initProxyToPassword(proxyToPassword);
  220. GlobalData.getInstance().initProxyToUri(proxyToUri);
  221. }
  222. }