package com.shkpr.service.proxycenter.configuration; import com.global.base.tools.EncryptionUtil; import com.global.base.tools.RandomUtil; import com.shkpr.service.proxycenter.components.*; import com.shkpr.service.proxycenter.constants.ProxyPassDefine; import com.shkpr.service.proxycenter.controllerfilter.CustomAuthenticationProvider; import com.shkpr.service.proxycenter.controllerfilter.SelfBizFilterMgr; import com.shkpr.service.proxycenter.globalcache.GlobalData; import org.mitre.dsmiley.httpproxy.ProxyServlet; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.annotation.PostConstruct; import java.util.HashMap; import java.util.Map; /** * 该类主要用来做权限控制的配置、以及注册各种过滤器 * 执行顺序 * (1) 注册验证组件 - configure(AuthenticationManagerBuilder auth)方法中注册自定义验证组件 * (2) 设置验证规则 - configure(HttpSecurity http)方法中设置了各种路由访问规则 * (3) 初始化过滤组件 - JWTLoginFilter 和 SelfAuthenticationFilter 类会初始化 */ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) //@PreAuthorize对权限的注解需要设置prePostEnabled = true @ConfigurationProperties(prefix = "atuocfg") public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Value("${global.test.pressure:false}") private boolean mBForPressureTest; @Value("${global.ops.lan.ip:127.0.0.1}") private String mStrOpsServerLanIP; private Map proxyToAddress = new HashMap<>(); private Map proxyToPassword = new HashMap<>(); private Map proxyToUri = new HashMap<>(); public Map getProxyToAddress() { return proxyToAddress; } public void setProxyToAddress(Map proxyToAddress) { this.proxyToAddress = proxyToAddress; } public Map getProxyToPassword() { return proxyToPassword; } public void setProxyToPassword(Map proxyToPassword) { this.proxyToPassword = proxyToPassword; } public Map getProxyToUri() { return proxyToUri; } public void setProxyToUri(Map proxyToUri) { this.proxyToUri = proxyToUri; } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //使用自定义身份验证组件 auth.authenticationProvider(new CustomAuthenticationProvider()); } // 设置 HTTP 验证规则 @Override protected void configure(HttpSecurity http) throws Exception { String[] arrOpsServerLanIPs = mStrOpsServerLanIP.split(";"); String strAccessFilterForOps = "hasIpAddress('127.0.0.1')"; for (String strTmp:arrOpsServerLanIPs){ strAccessFilterForOps += " or hasIpAddress('"+ strTmp +"')"; } http.csrf().disable() // 关闭csrf验证 .authorizeRequests() // 对请求进行认证 //.antMatchers(ApiURI.URI_BASE_PROXY_XXX).permitAll() .antMatchers("/**").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(new SelfBizFilterMgr("/**", authenticationManager()), UsernamePasswordAuthenticationFilter.class); //所有其他请求需要身份认证; /*.addFilterBefore(new ServerStatusMonitorFilter(ThirdApiURI.URI_HGAS_MONITOR_XXX, authenticationManager()), UsernamePasswordAuthenticationFilter.class);*/ } @Override public void configure(WebSecurity web) throws Exception { /*web.ignoring() .antMatchers("/error") .antMatchers("/static") .antMatchers("/static/**"); // 所有/static下的静态资源请求时都忽略访问规则 */ } @Bean(name = ProxyPassDefine.PROXY_BASE) @Primary public ServletRegistrationBean servletServletRegistrationForBase() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new BaseASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_BASE) , ProxyPassDefine.PROXY_BASE , proxyToAddress.get(ProxyPassDefine.PROXY_BASE) , EncryptionUtil.MD5Hash(proxyToPassword.getOrDefault(ProxyPassDefine.PROXY_BASE, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_BASE), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_TASK) public ServletRegistrationBean servletServletRegistrationForTask() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new TaskASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_TASK) , ProxyPassDefine.PROXY_TASK , proxyToAddress.get(ProxyPassDefine.PROXY_TASK) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_TASK, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_TASK), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_AI_MODEL) public ServletRegistrationBean servletServletRegistrationForAIModel() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new AIModelASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_AI_MODEL) , ProxyPassDefine.PROXY_AI_MODEL , proxyToAddress.get(ProxyPassDefine.PROXY_AI_MODEL) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_AI_MODEL, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_TASK), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_GW) public ServletRegistrationBean servletServletRegistrationForDataGW() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new DataGWASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_GW) , ProxyPassDefine.PROXY_GW , proxyToAddress.get(ProxyPassDefine.PROXY_GW) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_GW, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_GW), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_GIS) public ServletRegistrationBean servletServletRegistrationForGisAe() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new GisAEASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_GIS) , ProxyPassDefine.PROXY_GIS , proxyToAddress.get(ProxyPassDefine.PROXY_GIS) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_GIS, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_GIS), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_STATS) public ServletRegistrationBean servletServletRegistrationForIotStats() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new IotStatsASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_STATS) , ProxyPassDefine.PROXY_STATS , proxyToAddress.get(ProxyPassDefine.PROXY_STATS) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_STATS, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_STATS), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_OLD_STATS) public ServletRegistrationBean servletServletRegistrationForOldIotStats() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new IotStatsOldProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_OLD_STATS) , ProxyPassDefine.PROXY_OLD_STATS , proxyToAddress.get(ProxyPassDefine.PROXY_OLD_STATS) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_OLD_STATS, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_OLD_STATS), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_PUSH) public ServletRegistrationBean servletServletRegistrationForPush() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new PushASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_PUSH) , ProxyPassDefine.PROXY_PUSH , proxyToAddress.get(ProxyPassDefine.PROXY_PUSH) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_PUSH, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_PUSH), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_ANALY) public ServletRegistrationBean servletServletRegistrationForAnaly() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new AnalyASProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_ANALY) , ProxyPassDefine.PROXY_ANALY , proxyToAddress.get(ProxyPassDefine.PROXY_ANALY) , EncryptionUtil.MD5Hash(proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_ANALY, RandomUtil.getRandomStr(8))))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_ANALY), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @Bean(name = ProxyPassDefine.PROXY_GEOSERVER) public ServletRegistrationBean servletServletRegistrationForGeoServer() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(); servletRegistrationBean.setServlet(new GeoServerProxyServlet(proxyToUri.get(ProxyPassDefine.PROXY_GEOSERVER) , ProxyPassDefine.PROXY_GEOSERVER , proxyToAddress.get(ProxyPassDefine.PROXY_GEOSERVER) , proxyToAddress.getOrDefault(ProxyPassDefine.PROXY_ANALY, RandomUtil.getRandomStr(8)))); servletRegistrationBean.addUrlMappings(String.format("%s/%s", proxyToUri.get(ProxyPassDefine.PROXY_GEOSERVER), "*")); servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, "false"); servletRegistrationBean.addInitParameter( "targetUri", "https://127.0.0.1:9000"); return servletRegistrationBean; } @PostConstruct public void init(){ GlobalData.getInstance().initProxyToAddress(proxyToAddress); GlobalData.getInstance().initProxyToPassword(proxyToPassword); GlobalData.getInstance().initProxyToUri(proxyToUri); } }