package com.iplatform.base.config; import com.iplatform.base.SecuritySpi; import com.iplatform.base.UserLoginCache; import com.iplatform.base.service.LogServiceImpl; import com.iplatform.base.support.LogAspect; import com.iplatform.base.support.PlatformOperationInterceptor; import com.iplatform.base.support.strategy.AbstractLoginStrategy; import com.iplatform.base.support.strategy.LoginStrategyManager; import com.iplatform.base.support.strategy.MobileOnceLoginStrategy; import com.iplatform.base.support.strategy.WebOnceLoginStrategy; import com.iplatform.core.PlatformConfiguration; import com.walker.infrastructure.utils.StringUtils; import com.walker.web.RestTemplateConfig; import com.walker.web.RestTemplateFactory; import com.walker.web.TokenGenerator; import com.walker.web.WebAgentService; import com.walker.web.agent.BrowserCapWebAgentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; /** * Web操作通用配置。 * @author 时克英 * @date 2022-11-21 */ @Configuration public class WebCommonConfig extends PlatformConfiguration implements WebMvcConfigurer { private TokenGenerator tokenGenerator; @Autowired public WebCommonConfig(TokenGenerator tokenGenerator){ this.tokenGenerator = tokenGenerator; } // /** // * 测试登录回调。正式要注释掉,平台只允许业务配置一个!!! // * @return // * @date 2023-08-18 // */ // @Bean // public AfterLoginCallback afterLoginCallback(){ // return new TestAfterLoginCallback(); // } @Bean public LoginStrategyProperties loginStrategyProperties(){ return new LoginStrategyProperties(); } /** * 涉及用户安全的一些基本配置,如:登录错误次数、密码安全级别等。 * @return * @date 2023-08-05 */ @Bean public SecurityUserProperties securityUserProperties(){ return new SecurityUserProperties(); } @Bean public LoginStrategyManager loginStrategyManager(UserLoginCache userLoginCache){ LoginStrategyManager manager = new LoginStrategyManager(); manager.setUserLoginCache(userLoginCache); return manager; } /** * 配置登录策略定义,PC端(同一用户)只能登录一次,无法重复登录。 *
     *     1) 如果需要使用, 配置文件列表中,加上即可。
     * 
* @param userLoginCache * @param loginStrategyProperties * @param loginStrategyManager * @return * @date 2023-09-08 */ @Bean public WebOnceLoginStrategy webOnceLoginStrategy(UserLoginCache userLoginCache , LoginStrategyProperties loginStrategyProperties, LoginStrategyManager loginStrategyManager){ List enabledNameList = loginStrategyProperties.getLoginStrategyList(); WebOnceLoginStrategy strategy = new WebOnceLoginStrategy(); strategy.setUserLoginCache(userLoginCache); strategy.setTokenExpireWeb(loginStrategyProperties.getTokenExpireWeb()); strategy.setName("PC端同一账号只能登录一次"); this.setupRegisterLoginStrategy(enabledNameList, strategy, loginStrategyManager, WebOnceLoginStrategy.class.getName()); return strategy; } /** * 配置登录策略定义,并注册到管理器中。 *

移动端同一账号只能登录一次。

* @param userLoginCache * @param loginStrategyProperties * @return * @date 2023-07-11 */ @Bean public MobileOnceLoginStrategy mobileOnceLoginStrategy(UserLoginCache userLoginCache , LoginStrategyProperties loginStrategyProperties, LoginStrategyManager loginStrategyManager){ List enabledNameList = loginStrategyProperties.getLoginStrategyList(); MobileOnceLoginStrategy strategy = new MobileOnceLoginStrategy(); strategy.setUserLoginCache(userLoginCache); strategy.setTokenExpireMobile(loginStrategyProperties.getTokenExpireMobile()); strategy.setName("移动端同一账号只能登录一次"); // if(!StringUtils.isEmptyList(enabledNameList)){ // for(String name : enabledNameList){ // if(name.equals(strategy.getClass().getName())){ // strategy.setEnabled(true); // loginStrategyManager.register(strategy); // logger.info("启用了登录策略:{}", strategy.getName()); // break; // } // } // } this.setupRegisterLoginStrategy(enabledNameList, strategy, loginStrategyManager, MobileOnceLoginStrategy.class.getName()); return strategy; } private void setupRegisterLoginStrategy(List enabledNameList , AbstractLoginStrategy strategy, LoginStrategyManager loginStrategyManager, String strategyClazz){ if(!StringUtils.isEmptyList(enabledNameList)){ for(String name : enabledNameList){ if(name.equals(strategyClazz)){ strategy.setEnabled(true); loginStrategyManager.register(strategyClazz, strategy); logger.info("启用了登录策略:{}", strategy.getName()); break; } } } } /** * TCP通信模块配置内容,迁移到base模块中,因为前端要获取websocket.uri,该接口必须在基础模块,否则会严重依赖tcp。 * @return * @date 2023-04-17 */ @Bean public TcpProperties tcpProperties(){ return new TcpProperties(); } /** * 统一拦截Web操作相关,包括:清空分页线程变量等。 * @return * @date 2022-11-21 * @date 2023-01-28 去掉pathPattern限制,因为拦截器里面已经判断,对于特征 '/list' 统一执行分页准备。 * @date 2023-03-09 重写平台拦截器,添加对报表浏览权限控制。 */ @Override public void addInterceptors(InterceptorRegistry registry){ // registry.addInterceptor(new WebOperationInterceptor()) // .addPathPatterns("/system/**", "/api/**") ; PlatformOperationInterceptor platformOperationInterceptor = new PlatformOperationInterceptor(); platformOperationInterceptor.setTokenGenerator(this.tokenGenerator); registry.addInterceptor(platformOperationInterceptor); logger.info(".......... WebOperationInterceptor 注册成功"); } // /** // * 配置远程HTTP调用模板。 // * @return // * @date 2023-03-01 // */ // @Bean // public RestTemplate restTemplate(){ // RestTemplate restTemplate = new RestTemplate(); // List> messageConverters = restTemplate.getMessageConverters(); // Iterator> iterator=messageConverters.iterator(); // while(iterator.hasNext()){ // HttpMessageConverter converter=iterator.next(); // //原有的String是ISO-8859-1编码 去掉 // if(converter instanceof StringHttpMessageConverter){ // iterator.remove(); // } // } // messageConverters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); // return restTemplate; // } @Bean public RestTemplateProperties restTemplateProperties(){ return new RestTemplateProperties(); } /** * 重构 RestTemplate 生成,统一从工厂创建,支持多种http连接池方式,目前仅实现:okhttp * @param restTemplateProperties * @return * @date 2023-08-18 */ @Bean public RestTemplate restTemplateOkHttp(RestTemplateProperties restTemplateProperties){ RestTemplateConfig config = new RestTemplateConfig(); config.setKeepAliveDurationSeconds(restTemplateProperties.getKeepAliveDurationSeconds()); config.setMaxIdleConnections((int)restTemplateProperties.getMaxIdleConnections()); config.setConnectTimeoutSeconds(restTemplateProperties.getConnectTimeoutSeconds()); config.setReadTimeoutSeconds(restTemplateProperties.getReadTimeoutSeconds()); config.setWriteTimeoutSeconds(restTemplateProperties.getWriteTimeoutSeconds()); RestTemplate restTemplate = RestTemplateFactory.createRestTemplate(RestTemplateFactory.HttpType.OkHttp, config); return restTemplate; } /** * 配置一个浏览器代理解析对象。 *
     *     1)该对象默认使用基于 BrowserCap 一个开源组件实现底层解析
     *     2)IP查找位置调用了第三方服务: pconline
     * 
* @return * @date 2023-01-05 */ @Bean public WebAgentService webAgentService(){ return new BrowserCapWebAgentService(); } /** * 日志开关配置。 * @return * @date 2023-01-05 */ @Bean public LogProperties logProperties(){ return new LogProperties(); } // @Bean // public PlatformUserCallback testUserCallback(){ // return new TestUserCallback(); // } /** * 配置操作日志切面写入对象。 * @param securitySpi * @param logService * @return * @date 2023-01-06 */ @Bean public LogAspect logAspect(SecuritySpi securitySpi, LogServiceImpl logService, LogProperties logProperties){ LogAspect logAspect = new LogAspect(); logAspect.setSecuritySpi(securitySpi); logAspect.setLogService(logService); logAspect.setEnableLog(logProperties.isOperateEnabled()); logger.info("创建:LogAspect..."); return logAspect; } }