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;
}
}