Commit 43b64f4c authored by 王亮's avatar 王亮

finished (geetest).

parent b0013bb1
...@@ -40,6 +40,12 @@ public interface Constants { ...@@ -40,6 +40,12 @@ public interface Constants {
String X_BEHAVIOR_TYPE = "qg-behavior-type"; String X_BEHAVIOR_TYPE = "qg-behavior-type";
String X_BEHAVIOR_ID = "qg-behavior-id"; String X_BEHAVIOR_ID = "qg-behavior-id";
String X_BEHAVIOR_IMAGEVALUE = "qg-behavior-imageValue"; String X_BEHAVIOR_IMAGEVALUE = "qg-behavior-imageValue";
String X_BEHAVIOR_CHALLENGE = "qg-behavior-challenge";
String X_BEHAVIOR_VALIDATE = "qg-behavior-validate";
String X_BEHAVIOR_SECCODE = "qg-behavior-seccode";
String X_BEHAVIOR_IP="ip";
int VERIFICATION_LEN = 2; int VERIFICATION_LEN = 2;
int SMS_CODE_LEN_4 = 4; int SMS_CODE_LEN_4 = 4;
int SMS_CODE_LEN_6 = 6; int SMS_CODE_LEN_6 = 6;
......
...@@ -4,21 +4,28 @@ import cn.quantgroup.xyqb.model.ClientType; ...@@ -4,21 +4,28 @@ import cn.quantgroup.xyqb.model.ClientType;
import cn.quantgroup.xyqb.model.SettingType; import cn.quantgroup.xyqb.model.SettingType;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
@Data @Data
public class BehaviorReq { public class BehaviorReq {
/** /**
* 1:极验,2: 量化派图形验证码 * 1:极验,2: 量化派图形验证码
*/ */
@NotNull
private Integer type; private Integer type;
/** /**
* 手机号码 * 手机号码
*/ */
@Size(min = 11,max = 20)
private String phone; private String phone;
/** /**
* 0:h5,1:web,2:app * 0:h5,1:web,2:app
* @see ClientType * @see ClientType
*/ */
@NotNull
private Integer clientType; private Integer clientType;
/** /**
...@@ -27,6 +34,14 @@ public class BehaviorReq { ...@@ -27,6 +34,14 @@ public class BehaviorReq {
*/ */
private Integer settingType; private Integer settingType;
/**
* initializeDt,前端传过来,页面初始化极验时间(营销使用)
*/
private LocalDateTime initializeDt;
/**
* 通过request直接取
*/
private String ip; private String ip;
} }
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserTag;
import cn.quantgroup.xyqb.repository.IUserTagRepository;
import cn.quantgroup.xyqb.service.captcha.IGeetestLogService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* user_tag表,用来监听
*/
@Component
public class GeeTestLoginEventListener implements ApplicationListener<UserLoginEvent> {
@Autowired
private IGeetestLogService geetestLogService;
/**
* 逻辑 每次登录发送UserLoginEvent,落user_tag表
* 如果没有就新增,如果有就更新
*
* @param userLoginEvent UserLoginEvent
*/
@Override
public void onApplicationEvent(UserLoginEvent userLoginEvent) {
if (StringUtils.isNotEmpty(userLoginEvent.getGeetestId()) && userLoginEvent.getUserTag()!=null) {
geetestLogService.updateByUidGeetestLog(Long.valueOf(userLoginEvent.getGeetestId()),userLoginEvent.getUserTag().getUserId());
}
}
}
package cn.quantgroup.xyqb.event; package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserTag; import cn.quantgroup.xyqb.entity.UserTag;
import cn.quantgroup.xyqb.model.LoginBean;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
...@@ -17,6 +18,7 @@ import org.springframework.context.annotation.Configuration; ...@@ -17,6 +18,7 @@ import org.springframework.context.annotation.Configuration;
public class UserLoginEvent extends ApplicationEvent { public class UserLoginEvent extends ApplicationEvent {
private UserTag userTag; private UserTag userTag;
private String geetestId;
public UserLoginEvent(Object source) { public UserLoginEvent(Object source) {
super(source); super(source);
...@@ -26,4 +28,9 @@ public class UserLoginEvent extends ApplicationEvent { ...@@ -26,4 +28,9 @@ public class UserLoginEvent extends ApplicationEvent {
super(source); super(source);
this.userTag = userTag; this.userTag = userTag;
} }
public UserLoginEvent(Object source, UserTag userTag, String geetestId) {
super(source);
this.userTag = userTag;
this.geetestId = geetestId;
}
} }
...@@ -15,12 +15,13 @@ public enum BizExceptionEnum { ...@@ -15,12 +15,13 @@ public enum BizExceptionEnum {
ERROR_PASSWORD("1004","用户名或者密码错误"), ERROR_PASSWORD("1004","用户名或者密码错误"),
// 验证码相关20开头 // 验证码相关 20 开头
FAIL_GENERATE_IMAGE("2001","生成图片失败"), FAIL_GENERATE_IMAGE("2001","生成图片失败"),
FAIL_VERIFY_CODE("2002","图形验证码错误"), FAIL_VERIFY_CODE("2002","图形验证码错误"),
UN_EXIT_VERIFY_TYPE("2003","不存在的验证码方式"), UN_EXIT_VERIFY_TYPE("2003","不存在的验证码方式"),
UN_EXIT_VERIFY_CODE("2004","验证模式下验证码参数不能为空"); UN_EXIT_VERIFY_CODE("2004","验证模式下验证码参数不能为空"),
EX_GET_VERIFY_CODE("2005","获取验证码失败"),
UN_EXIT_GEETEST_LOG("2006","极验记录不存在");
private final String businessCode; private final String businessCode;
......
...@@ -6,6 +6,7 @@ import cn.quantgroup.xyqb.exception.BizException; ...@@ -6,6 +6,7 @@ import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum; import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.service.v2.BehaviorContext; import cn.quantgroup.xyqb.service.v2.BehaviorContext;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder; import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import cn.quantgroup.xyqb.util.IpUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
...@@ -24,43 +25,60 @@ public class BehaviorInterceptor implements HandlerInterceptor { ...@@ -24,43 +25,60 @@ public class BehaviorInterceptor implements HandlerInterceptor {
} }
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String type = request.getHeader(Constants.X_BEHAVIOR_TYPE); String type = request.getHeader(Constants.X_BEHAVIOR_TYPE);
if (StringUtils.isEmpty(type) || !StringUtils.isNumeric(type)) { if (StringUtils.isEmpty(type) || !StringUtils.isNumeric(type)) {
return true; return true;
} }
String id = request.getHeader(Constants.X_BEHAVIOR_ID);
if(StringUtils.isEmpty(id)){
throw new BizException(BizExceptionEnum.UN_EXIT_VERIFY_CODE);
}
Map<String, String> data = new HashMap<>();
data.put(Constants.X_BEHAVIOR_ID, id);
data.put(Constants.X_BEHAVIOR_IP,IpUtil.getRemoteIP(request));
ValidateBehavior validateBehavior = new ValidateBehavior();
switch (Integer.parseInt(type)) { switch (Integer.parseInt(type)) {
case 1: case 1:
String challenge = request.getHeader(Constants.X_BEHAVIOR_CHALLENGE);
String validate = request.getHeader(Constants.X_BEHAVIOR_VALIDATE);
String secCode = request.getHeader(Constants.X_BEHAVIOR_SECCODE);
if(StringUtils.isEmpty(challenge) || StringUtils.isEmpty(validate)||StringUtils.isEmpty(secCode)){
throw new BizException(BizExceptionEnum.UN_EXIT_VERIFY_CODE);
}
validateBehavior.setType(1);
data.put(Constants.X_BEHAVIOR_CHALLENGE, challenge);
data.put(Constants.X_BEHAVIOR_VALIDATE, validate);
data.put(Constants.X_BEHAVIOR_SECCODE, secCode);
//走极验逻辑 //走极验逻辑
return false; break;
case 2: case 2:
//走量化派图形验证逻辑 //走量化派图形验证逻辑
String id = request.getHeader(Constants.X_BEHAVIOR_ID);
String imageValue = request.getHeader(Constants.X_BEHAVIOR_IMAGEVALUE); String imageValue = request.getHeader(Constants.X_BEHAVIOR_IMAGEVALUE);
if (StringUtils.isEmpty(id) || StringUtils.isEmpty(imageValue)) { if (StringUtils.isEmpty(imageValue)) {
throw new BizException(BizExceptionEnum.UN_EXIT_VERIFY_CODE); throw new BizException(BizExceptionEnum.UN_EXIT_VERIFY_CODE);
} }
ValidateBehavior validateBehavior = new ValidateBehavior();
validateBehavior.setType(2); validateBehavior.setType(2);
Map<String, String> data = new HashMap<>(); data.put(Constants.X_BEHAVIOR_IMAGEVALUE, imageValue);
data.put("id", id); break;
data.put("imageValue", imageValue);
validateBehavior.setData(data);
behaviorContext.validate(validateBehavior);
default: default:
return true; return true;
}
}
validateBehavior.setData(data);
return behaviorContext.validate(validateBehavior);
} }
@Override @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
} }
@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
XyqbSessionContextHolder.releaseSession(); XyqbSessionContextHolder.releaseSession();
} }
} }
...@@ -16,10 +16,11 @@ public class BehaviorCodeBean { ...@@ -16,10 +16,11 @@ public class BehaviorCodeBean {
private QtCode qtCode; private QtCode qtCode;
private GeetestCode geetestCode; private GeetestCode geetestCode;
private String id;
@Data @Data
@Builder @Builder
public static class QtCode { public static class QtCode {
private String imageId;
private String imageData; private String imageData;
} }
......
...@@ -6,7 +6,7 @@ import java.util.Optional; ...@@ -6,7 +6,7 @@ import java.util.Optional;
* 验证码验证类型 * 验证码验证类型
* *
* @author renwc * @author renwc
* @date 2018-02-02 * @since 2018-02-02
*/ */
public enum ClientType { public enum ClientType {
APP("native"), H5("h5"), WEB("web"); APP("native"), H5("h5"), WEB("web");
...@@ -15,7 +15,7 @@ public enum ClientType { ...@@ -15,7 +15,7 @@ public enum ClientType {
this.alias = alias; this.alias = alias;
} }
private String alias; private final String alias;
public String getAlias() { public String getAlias() {
return this.alias; return this.alias;
...@@ -35,9 +35,9 @@ public enum ClientType { ...@@ -35,9 +35,9 @@ public enum ClientType {
public static ClientType valueByCode(Integer code) { public static ClientType valueByCode(Integer code) {
switch (code) { switch (code) {
case 0:
return H5;
case 1: case 1:
return H5;
case 2:
return WEB; return WEB;
default: default:
return APP; return APP;
......
...@@ -4,7 +4,6 @@ import java.util.Optional; ...@@ -4,7 +4,6 @@ import java.util.Optional;
/** /**
* 验证场景类型 * 验证场景类型
*
*/ */
public enum SettingType { public enum SettingType {
PASSWD("账密"), SMSLOGIN("短验"); PASSWD("账密"), SMSLOGIN("短验");
...@@ -13,7 +12,7 @@ public enum SettingType { ...@@ -13,7 +12,7 @@ public enum SettingType {
this.alias = alias; this.alias = alias;
} }
private String alias; private final String alias;
public String getAlias() { public String getAlias() {
return this.alias; return this.alias;
...@@ -21,22 +20,18 @@ public enum SettingType { ...@@ -21,22 +20,18 @@ public enum SettingType {
public static SettingType valueByName(String name) { public static SettingType valueByName(String name) {
name = Optional.ofNullable(name).orElse("").toLowerCase(); name = Optional.ofNullable(name).orElse("").toLowerCase();
switch (name) { if ("短验".equals(name)) {
case "短验": return SMSLOGIN;
return SMSLOGIN;
default:
return PASSWD;
} }
return PASSWD;
} }
public static SettingType valueByCode(Integer code) { public static SettingType valueByCode(Integer code) {
switch (code) { if (code != null && code == 1) {
case 1: return SMSLOGIN;
return SMSLOGIN;
default:
return PASSWD;
} }
return PASSWD;
} }
} }
...@@ -18,10 +18,13 @@ public class SessionStruct implements Serializable { ...@@ -18,10 +18,13 @@ public class SessionStruct implements Serializable {
private SessionValue values; private SessionValue values;
private long expire; private long expire;
private Integer tenantId; private Integer tenantId;
private Integer registeredFrom; private Long registeredFrom;
private String ip; private String ip;
//极验的记录id
private String geetestId;
public void setAttribute(String key, String value) { public void setAttribute(String key, String value) {
if (value == null) { if (value == null) {
value = ""; value = "";
......
package cn.quantgroup.xyqb.service.captcha; package cn.quantgroup.xyqb.service.captcha;
import cn.quantgroup.xyqb.entity.GeetestLogEntity;
import java.util.Map; import java.util.Map;
/** /**
...@@ -14,4 +16,6 @@ public interface IGeetestLogService { ...@@ -14,4 +16,6 @@ public interface IGeetestLogService {
void updateByUidGeetestLog(Long geetestLogId, Long id); void updateByUidGeetestLog(Long geetestLogId, Long id);
void executeTask(); void executeTask();
GeetestLogEntity getById(Long id);
} }
package cn.quantgroup.xyqb.service.captcha.impl; package cn.quantgroup.xyqb.service.captcha.impl;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.GeetestLogEntity; import cn.quantgroup.xyqb.entity.GeetestLogEntity;
import cn.quantgroup.xyqb.model.ClientType; import cn.quantgroup.xyqb.model.ClientType;
import cn.quantgroup.xyqb.model.SettingType; import cn.quantgroup.xyqb.model.SettingType;
...@@ -8,10 +9,12 @@ import cn.quantgroup.xyqb.service.captcha.IGeetestLogService; ...@@ -8,10 +9,12 @@ import cn.quantgroup.xyqb.service.captcha.IGeetestLogService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
...@@ -22,9 +25,11 @@ import java.util.Map; ...@@ -22,9 +25,11 @@ import java.util.Map;
@Service @Service
@Slf4j @Slf4j
public class GeetestLogServiceImpl implements IGeetestLogService { public class GeetestLogServiceImpl implements IGeetestLogService {
private final IGeetestLogRepository geetestLogRepository;
@Resource public GeetestLogServiceImpl(IGeetestLogRepository geetestLogRepository) {
private IGeetestLogRepository geetestLogRepository; this.geetestLogRepository = geetestLogRepository;
}
@Override @Override
public Long saveGeetestLog(String phoneNo, String clientType, String settingType, Map<String, String> imgMap) { public Long saveGeetestLog(String phoneNo, String clientType, String settingType, Map<String, String> imgMap) {
...@@ -34,15 +39,26 @@ public class GeetestLogServiceImpl implements IGeetestLogService { ...@@ -34,15 +39,26 @@ public class GeetestLogServiceImpl implements IGeetestLogService {
geetestLogEntity.setSetting(SettingType.valueByName(settingType).ordinal()); geetestLogEntity.setSetting(SettingType.valueByName(settingType).ordinal());
geetestLogEntity.setChallenge(imgMap.getOrDefault("reChallenge", "")); geetestLogEntity.setChallenge(imgMap.getOrDefault("reChallenge", ""));
geetestLogEntity.setCaptchaId(imgMap.getOrDefault("gt", "")); geetestLogEntity.setCaptchaId(imgMap.getOrDefault("gt", ""));
if (imgMap.containsKey(Constants.QG_CAPTCHA_INITDT)) {
geetestLogEntity.setInitializeDt(Date.from(LocalDateTime.parse(imgMap.get(Constants.QG_CAPTCHA_INITDT)).toInstant(ZoneOffset.UTC)));
}
if (imgMap.containsKey(Constants.QG_CAPTCHA_REGISTERDT)) {
geetestLogEntity.setRegisterDt(Date.from(LocalDateTime.parse(imgMap.get(Constants.QG_CAPTCHA_REGISTERDT)).toInstant(ZoneOffset.UTC)));
}
if (imgMap.containsKey(Constants.QG_CAPTCHA_REGISTERREDT)) {
geetestLogEntity.setRegisterReDt(Date.from(LocalDateTime.parse(imgMap.get(Constants.QG_CAPTCHA_REGISTERREDT)).toInstant(ZoneOffset.UTC)));
}
geetestLogEntity = geetestLogRepository.saveAndFlush(geetestLogEntity); geetestLogEntity = geetestLogRepository.saveAndFlush(geetestLogEntity);
return geetestLogEntity.getId(); return geetestLogEntity.getId();
} }
@Override @Override
@Transactional
public void updateGeetestLog(String geetestLogId, String initializeDt, String registerDt, String registerReDt, Map<String, Object> result) { public void updateGeetestLog(String geetestLogId, String initializeDt, String registerDt, String registerReDt, Map<String, Object> result) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try { try {
GeetestLogEntity geetestLogEntity = geetestLogRepository.getOne(Long.parseLong(geetestLogId)); GeetestLogEntity geetestLogEntity = geetestLogRepository.findOne(Long.parseLong(geetestLogId));
if (geetestLogEntity != null) { if (geetestLogEntity != null) {
if (StringUtils.isNotBlank(initializeDt) && StringUtils.isNotBlank(registerDt) && StringUtils.isNotBlank(registerReDt)) { if (StringUtils.isNotBlank(initializeDt) && StringUtils.isNotBlank(registerDt) && StringUtils.isNotBlank(registerReDt)) {
geetestLogEntity.setInitializeDt(simpleDateFormat.parse(initializeDt)); geetestLogEntity.setInitializeDt(simpleDateFormat.parse(initializeDt));
...@@ -81,11 +97,16 @@ public class GeetestLogServiceImpl implements IGeetestLogService { ...@@ -81,11 +97,16 @@ public class GeetestLogServiceImpl implements IGeetestLogService {
dt = c.getTime(); dt = c.getTime();
log.info("执行删除超过180天的极验日志记录--{}", dt); log.info("执行删除超过180天的极验日志记录--{}", dt);
Timestamp ts=new Timestamp(dt.getTime()); Timestamp ts = new Timestamp(dt.getTime());
geetestLogRepository.deleteByCreatedAtIsBefore(ts); geetestLogRepository.deleteByCreatedAtIsBefore(ts);
} catch (Exception e) { } catch (Exception e) {
log.error("执行删除超过180天的极验即日记录--{}", e.getMessage()); log.error("执行删除超过180天的极验即日记录--{}", e.getMessage());
} }
} }
@Override
public GeetestLogEntity getById(Long id) {
return geetestLogRepository.findOne(id);
}
} }
...@@ -16,7 +16,7 @@ public class BehaviorContext { ...@@ -16,7 +16,7 @@ public class BehaviorContext {
private final Map<Integer,BehaviorStrategy> behaviorStrategyMap = new HashMap<>(); private final Map<Integer,BehaviorStrategy> behaviorStrategyMap = new HashMap<>();
public BehaviorContext(List<LoginStrategy> loginStrategies, List<BehaviorStrategy> behaviorStrategies) { public BehaviorContext(List<BehaviorStrategy> behaviorStrategies) {
behaviorStrategies.forEach(i->behaviorStrategyMap.put(i.getType(), i)); behaviorStrategies.forEach(i->behaviorStrategyMap.put(i.getType(), i));
} }
......
package cn.quantgroup.xyqb.service.v2; package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq; import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior; import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior;
import cn.quantgroup.xyqb.entity.GeetestLogEntity;
import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.model.BehaviorCodeBean; import cn.quantgroup.xyqb.model.BehaviorCodeBean;
import cn.quantgroup.xyqb.model.ClientType; import cn.quantgroup.xyqb.model.ClientType;
import cn.quantgroup.xyqb.model.SettingType;
import cn.quantgroup.xyqb.service.captcha.IGeetestCaptchaService; import cn.quantgroup.xyqb.service.captcha.IGeetestCaptchaService;
import cn.quantgroup.xyqb.service.captcha.IGeetestLogService;
import cn.quantgroup.xyqb.service.captcha.IQuantgroupCaptchaService;
import cn.quantgroup.xyqb.util.PasswordUtil; import cn.quantgroup.xyqb.util.PasswordUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import java.time.LocalDateTime;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
...@@ -18,8 +26,16 @@ import java.util.UUID; ...@@ -18,8 +26,16 @@ import java.util.UUID;
*/ */
@Service @Service
public class GeetestBehaviorStrategy implements BehaviorStrategy { public class GeetestBehaviorStrategy implements BehaviorStrategy {
@Resource private final IGeetestCaptchaService geetestCaptchaService;
private IGeetestCaptchaService geetestCaptchaService; private final IGeetestLogService geetestLogService;
private final IQuantgroupCaptchaService quantgroupCaptchaService;
public GeetestBehaviorStrategy(IGeetestCaptchaService geetestCaptchaService, IGeetestLogService geetestLogService, IQuantgroupCaptchaService quantgroupCaptchaService) {
this.geetestCaptchaService = geetestCaptchaService;
this.geetestLogService = geetestLogService;
this.quantgroupCaptchaService = quantgroupCaptchaService;
}
@Override @Override
public Integer getType() { public Integer getType() {
...@@ -28,7 +44,22 @@ public class GeetestBehaviorStrategy implements BehaviorStrategy { ...@@ -28,7 +44,22 @@ public class GeetestBehaviorStrategy implements BehaviorStrategy {
@Override @Override
public boolean validate(ValidateBehavior validateBehavior) { public boolean validate(ValidateBehavior validateBehavior) {
return false; GeetestLogEntity geetestLogEntity = geetestLogService.getById(Long.valueOf(validateBehavior.getData().get(Constants.X_BEHAVIOR_ID)));
if (geetestLogEntity == null) {
throw new BizException(BizExceptionEnum.UN_EXIT_GEETEST_LOG);
}
Map<String, Object> result;
String key = StringUtils.isNotBlank(geetestLogEntity.getPhoneNo()) ? geetestLogEntity.getPhoneNo().trim() : UUID.randomUUID().toString();
if (SettingType.PASSWD.getAlias().equals(SettingType.valueByCode(validateBehavior.getType()).getAlias())) {
result = geetestCaptchaService.validGeetestCaptchaPasswd(key, validateBehavior.getData().get(Constants.X_BEHAVIOR_IP), ClientType.valueByCode(geetestLogEntity.getDataSource()), validateBehavior.getData().get(Constants.X_BEHAVIOR_CHALLENGE), validateBehavior.getData().get(Constants.X_BEHAVIOR_VALIDATE), validateBehavior.getData().get(Constants.X_BEHAVIOR_SECCODE));
} else {
result = geetestCaptchaService.validGeetestCaptcha(key, validateBehavior.getData().get(Constants.X_BEHAVIOR_IP), ClientType.valueByCode(geetestLogEntity.getDataSource()) , validateBehavior.getData().get(Constants.X_BEHAVIOR_CHALLENGE), validateBehavior.getData().get(Constants.X_BEHAVIOR_VALIDATE), validateBehavior.getData().get(Constants.X_BEHAVIOR_SECCODE));
}
geetestLogService.updateGeetestLog(validateBehavior.getData().get(Constants.X_BEHAVIOR_ID), null, null, null, result);
return (boolean) result.get("valid");
} }
...@@ -37,17 +68,35 @@ public class GeetestBehaviorStrategy implements BehaviorStrategy { ...@@ -37,17 +68,35 @@ public class GeetestBehaviorStrategy implements BehaviorStrategy {
BehaviorCodeBean behaviorCodeBean = new BehaviorCodeBean(); BehaviorCodeBean behaviorCodeBean = new BehaviorCodeBean();
String key = StringUtils.isNotBlank(behaviorReq.getPhone()) ? behaviorReq.getPhone().trim() : UUID.randomUUID().toString(); String key = StringUtils.isNotBlank(behaviorReq.getPhone()) ? behaviorReq.getPhone().trim() : UUID.randomUUID().toString();
// key指纹 // key指纹
String registerDt = LocalDateTime.now().toString();
Map<String, String> imgMap = geetestCaptchaService.fetchGeetestCaptcha(PasswordUtil.MD5(key), behaviorReq.getIp(), ClientType.valueByCode(behaviorReq.getClientType())); Map<String, String> imgMap = geetestCaptchaService.fetchGeetestCaptcha(PasswordUtil.MD5(key), behaviorReq.getIp(), ClientType.valueByCode(behaviorReq.getClientType()));
if (imgMap.containsKey("success") && "1".equals(imgMap.get("success"))) { if (imgMap.containsKey("success") && "1".equals(imgMap.get("success"))) {
behaviorCodeBean.setType(1); behaviorCodeBean.setType(1);
behaviorCodeBean.setGeetestCode(BehaviorCodeBean.GeetestCode.builder().gt(imgMap.get("gt")) behaviorCodeBean.setGeetestCode(BehaviorCodeBean.GeetestCode.builder().gt(imgMap.get("gt"))
.challenge(imgMap.get("challenge")) .challenge(imgMap.get("challenge"))
.reChallenge(imgMap.get("reChallenge")). .reChallenge(imgMap.get("reChallenge")
).offline(false).newCaptcha(true).
build()); build());
String registerReDt = LocalDateTime.now().toString();
imgMap.put(Constants.QG_CAPTCHA_INITDT,behaviorReq.getInitializeDt().toString());
imgMap.put(Constants.QG_CAPTCHA_REGISTERDT,registerDt);
imgMap.put(Constants.QG_CAPTCHA_REGISTERREDT,registerReDt);
Long geetestLogId = geetestLogService.saveGeetestLog(behaviorReq.getPhone(), ClientType.valueByCode(behaviorReq.getClientType()).getAlias(), SettingType.valueByCode(behaviorReq.getSettingType()).getAlias(), imgMap);
behaviorCodeBean.setId(String.valueOf(geetestLogId));
} else { } else {
//降级方案
behaviorCodeBean.setType(2); behaviorCodeBean.setType(2);
imgMap = quantgroupCaptchaService.fetchQuantgroupCaptcha(Locale.CHINA);
if (imgMap != null) {
behaviorCodeBean.setQtCode(BehaviorCodeBean.QtCode.builder()
.imageData(imgMap.get("image")).build());
behaviorCodeBean.setId(imgMap.get("imageId"));
} else {
throw new BizException(BizExceptionEnum.EX_GET_VERIFY_CODE);
}
} }
return behaviorCodeBean; return behaviorCodeBean;
} }
......
package cn.quantgroup.xyqb.service.v2; package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq; import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.entity.UserTag;
import cn.quantgroup.xyqb.event.UserLoginEvent;
import cn.quantgroup.xyqb.model.LoginBean; import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam; import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap; import java.util.HashMap;
...@@ -12,9 +18,10 @@ import java.util.Map; ...@@ -12,9 +18,10 @@ import java.util.Map;
@Service @Service
public class LoginContext { public class LoginContext {
private final Map<Integer, LoginStrategy> loginStrategyMap = new HashMap<>(); private final Map<Integer, LoginStrategy> loginStrategyMap = new HashMap<>();
private final ApplicationEventPublisher applicationEventPublisher;
public LoginContext(List<LoginStrategy> loginStrategies, ApplicationEventPublisher applicationEventPublisher) {
public LoginContext(List<LoginStrategy> loginStrategies) { this.applicationEventPublisher = applicationEventPublisher;
loginStrategies.forEach(i -> loginStrategyMap.put(i.getType(), i)); loginStrategies.forEach(i -> loginStrategyMap.put(i.getType(), i));
} }
...@@ -25,8 +32,20 @@ public class LoginContext { ...@@ -25,8 +32,20 @@ public class LoginContext {
//第二步、执行登录操作 //第二步、执行登录操作
LoginBean loginBean = loginStrategy.login(loginParam);
//第三步、发送登录成功消息
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSession();
UserTag userTag = UserTag.builder().userId(loginBean.getUserId()).registeredFrom(sessionStruct.getRegisteredFrom()).tenantId(sessionStruct.getTenantId()).build();
String geetestId = null;
if (StringUtils.isNotEmpty(sessionStruct.getGeetestId())) {
geetestId = sessionStruct.getGeetestId();
}
UserLoginEvent userLoginEvent = new UserLoginEvent(this, userTag, geetestId);
applicationEventPublisher.publishEvent(userLoginEvent);
return loginStrategy.login(loginParam); return loginBean;
} }
} }
package cn.quantgroup.xyqb.service.v2; package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq; import cn.quantgroup.xyqb.controller.req.v2.BehaviorReq;
import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior; import cn.quantgroup.xyqb.controller.req.v2.ValidateBehavior;
import cn.quantgroup.xyqb.exception.BizException; import cn.quantgroup.xyqb.exception.BizException;
...@@ -40,7 +41,7 @@ public class QuantGroupBehaviorStrategy implements BehaviorStrategy { ...@@ -40,7 +41,7 @@ public class QuantGroupBehaviorStrategy implements BehaviorStrategy {
@Override @Override
public boolean validate(ValidateBehavior validateBehavior) { public boolean validate(ValidateBehavior validateBehavior) {
boolean result = quantgroupCaptchaService.validQuantgroupCaptcha(validateBehavior.getData().get("id"),validateBehavior.getData().get("imageValue")); boolean result = quantgroupCaptchaService.validQuantgroupCaptcha(validateBehavior.getData().get("id"),validateBehavior.getData().get(Constants.X_BEHAVIOR_IMAGEVALUE));
if(result){ if(result){
return true; return true;
}else{ }else{
...@@ -56,7 +57,8 @@ public class QuantGroupBehaviorStrategy implements BehaviorStrategy { ...@@ -56,7 +57,8 @@ public class QuantGroupBehaviorStrategy implements BehaviorStrategy {
if (challenge == null) { if (challenge == null) {
throw new BizException(BizExceptionEnum.FAIL_GENERATE_IMAGE); throw new BizException(BizExceptionEnum.FAIL_GENERATE_IMAGE);
} }
behaviorCodeBean.setQtCode(BehaviorCodeBean.QtCode.builder().imageId(challenge.get("imageId")).imageData(challenge.get("image")).build()); behaviorCodeBean.setQtCode(BehaviorCodeBean.QtCode.builder().imageData(challenge.get("image")).build());
behaviorCodeBean.setId(challenge.get("imageId"));
return behaviorCodeBean; return behaviorCodeBean;
} }
} }
...@@ -37,22 +37,27 @@ public class XyqbSessionContextHolder { ...@@ -37,22 +37,27 @@ public class XyqbSessionContextHolder {
return sessionStruct; return sessionStruct;
} }
public static SessionStruct initXSession() { public static void initXSession() {
SessionStruct sessionStruct; SessionStruct sessionStruct;
if (threadSession.get() != null) { if (threadSession.get() == null) {
sessionStruct = threadSession.get();
} else {
sessionStruct = new SessionStruct(); sessionStruct = new SessionStruct();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String tenantId = request.getHeader(Constants.X_AUTH_TENANT); String tenantId = request.getHeader(Constants.X_AUTH_TENANT);
String registered_from = request.getHeader(Constants.X_AUTH_FROM); String registered_from = request.getHeader(Constants.X_AUTH_FROM);
String ip = IpUtil.getRemoteIP(request); String ip = IpUtil.getRemoteIP(request);
sessionStruct.setTenantId(Integer.valueOf(tenantId)); sessionStruct.setTenantId(Integer.valueOf(tenantId));
sessionStruct.setRegisteredFrom(Integer.valueOf(registered_from)); sessionStruct.setRegisteredFrom(Long.valueOf(registered_from));
sessionStruct.setIp(ip); sessionStruct.setIp(ip);
//如果是极验,那赋值
if (request.getHeader(Constants.X_BEHAVIOR_TYPE) != null && "1".equals(request.getHeader(Constants.X_BEHAVIOR_TYPE))) {
String geetestId = request.getHeader(Constants.X_BEHAVIOR_ID);
sessionStruct.setGeetestId(geetestId);
}
threadSession.set(sessionStruct); threadSession.set(sessionStruct);
} }
return sessionStruct;
} }
public static SessionStruct getXSessionFromRedis() { public static SessionStruct getXSessionFromRedis() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment