Commit c414a844 authored by 王亮's avatar 王亮

temp commit(union login)

parent 0ec651f1
---用户表 ---用户表
ALTER TABLE `xyqb_user`.`user` ALTER TABLE `xyqb_user`.`user`
ADD COLUMN `password_type` TINYINT(3) NULL DEFAULT 0 COMMENT '0:是用户中心之前的加密方式,1:是消费地图迁移的数据加密方式' AFTER `bcrypt_password`, ADD COLUMN `password_type` TINYINT(3) NULL DEFAULT 0 COMMENT '0:是用户中心之前的加密方式,1:是消费地图迁移的数据加密方式' AFTER `cipher_password`,
ADD COLUMN `tenant_id` INT NULL COMMENT '租户id' AFTER `password_type`; ADD COLUMN `tenant_id` INT NULL COMMENT '租户id' AFTER `password_type`;
----新增用户资料表 ----新增用户资料表
...@@ -18,7 +18,7 @@ CREATE TABLE `xyqb_user`.`user_info` ( ...@@ -18,7 +18,7 @@ CREATE TABLE `xyqb_user`.`user_info` (
`province_id` INT NULL COMMENT '地址省份id', `province_id` INT NULL COMMENT '地址省份id',
`city_id` INT NULL COMMENT '地址市id', `city_id` INT NULL COMMENT '地址市id',
`address` VARCHAR(255) NULL COMMENT '详细地址', `address` VARCHAR(255) NULL COMMENT '详细地址',
`tenant_id` INT NOT NULL COMMENT '租户id', `tenant_id` INT NOT NULL DEFAULT 560761 COMMENT '租户id',
`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
......
...@@ -34,6 +34,10 @@ public interface Constants { ...@@ -34,6 +34,10 @@ public interface Constants {
String X_AUTH_TOKEN = "x-auth-token"; String X_AUTH_TOKEN = "x-auth-token";
String X_AUTH_TENANT = "qg-tenant-id"; String X_AUTH_TENANT = "qg-tenant-id";
String X_AUTH_FROM = "qg-registered-from";
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;
...@@ -51,7 +55,9 @@ public interface Constants { ...@@ -51,7 +55,9 @@ public interface Constants {
int AGE_MAX = 150; int AGE_MAX = 150;
int USER_QUERY_INFO_BATCH_SIZE = 3000; int USER_QUERY_INFO_BATCH_SIZE = 3000;
int USER_ID_BATCH_SIZE = 500; int USER_ID_BATCH_SIZE = 500;
/** 垃圾,前辈竟然用这个办法来识别UUID */ /**
* 垃圾,前辈竟然用这个办法来识别UUID
*/
int UUID_MIN_LENGTH = 10; int UUID_MIN_LENGTH = 10;
String AUTO_SORT_TYPE = "auto"; String AUTO_SORT_TYPE = "auto";
String CHECK_FAIL = "fail"; String CHECK_FAIL = "fail";
...@@ -180,9 +186,13 @@ public interface Constants { ...@@ -180,9 +186,13 @@ public interface Constants {
* 默认随机密码长度 * 默认随机密码长度
*/ */
int RANDOM_PWD_LEN = 15; int RANDOM_PWD_LEN = 15;
/** 旧的大陆身份证号长度 */ /**
* 旧的大陆身份证号长度
*/
int ID_NO_OLD_LENGTH = 15; int ID_NO_OLD_LENGTH = 15;
/** 标准大陆身份证号长度 */ /**
* 标准大陆身份证号长度
*/
int ID_NO_STANDARD_LENGTH = 18; int ID_NO_STANDARD_LENGTH = 18;
int ID_NO_CHECK_LENGTH = 17; int ID_NO_CHECK_LENGTH = 17;
int ID_NO_AREA_CODE_LENGTH = 2; int ID_NO_AREA_CODE_LENGTH = 2;
...@@ -220,7 +230,7 @@ public interface Constants { ...@@ -220,7 +230,7 @@ public interface Constants {
String QG_CAPTCHA_REGISTERDT = "register_dt"; String QG_CAPTCHA_REGISTERDT = "register_dt";
String QG_CAPTCHA_REGISTERREDT = "register_re_dt"; String QG_CAPTCHA_REGISTERREDT = "register_re_dt";
String QG_CAPTCHA_GEETESTLOGID = "geetestlog_id"; String QG_CAPTCHA_GEETESTLOGID = "geetestlog_id";
String QG_CAPTCHA_SETTINGTYPE= "settingType"; String QG_CAPTCHA_SETTINGTYPE = "settingType";
/** /**
* 客户端类型参数名 * 客户端类型参数名
*/ */
...@@ -243,6 +253,8 @@ public interface Constants { ...@@ -243,6 +253,8 @@ public interface Constants {
String VERIFY_TYPE_NONE = "none"; String VERIFY_TYPE_NONE = "none";
// -- End -- 验证码常量组 // -- End -- 验证码常量组
/** 注销用户后再次允许注册时间间隔-天数 */ /**
* 注销用户后再次允许注册时间间隔-天数
*/
long DELETE_USER_AGAIN_REGISTER_INTERVAL = 90; long DELETE_USER_AGAIN_REGISTER_INTERVAL = 90;
} }
package cn.quantgroup.xyqb.config.http; package cn.quantgroup.xyqb.config.http;
import cn.quantgroup.xyqb.filter.TokenInterceptor;
import cn.quantgroup.xyqb.service.session.ISessionService;
import org.hibernate.validator.HibernateValidator; import org.hibernate.validator.HibernateValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import javax.validation.Validation; import javax.validation.Validation;
...@@ -14,6 +18,9 @@ import javax.validation.ValidatorFactory; ...@@ -14,6 +18,9 @@ import javax.validation.ValidatorFactory;
@Component @Component
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter { public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Autowired
private ISessionService sessionService;
@Override @Override
public void addFormatters(FormatterRegistry registry) { public void addFormatters(FormatterRegistry registry) {
registry.removeConvertible(String.class, Enum.class); registry.removeConvertible(String.class, Enum.class);
...@@ -37,8 +44,8 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter { ...@@ -37,8 +44,8 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
return postProcessor; return postProcessor;
} }
// @Override @Override
// public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/innerapi/user/**"); registry.addInterceptor(new TokenInterceptor(sessionService)).addPathPatterns("/v2/**");
// } }
} }
\ No newline at end of file
...@@ -201,4 +201,9 @@ public class ExceptionHandlingController implements IBaseController { ...@@ -201,4 +201,9 @@ public class ExceptionHandlingController implements IBaseController {
public JsonResult<?> handleAccessForbiddenException(AccessForbiddenException e) { public JsonResult<?> handleAccessForbiddenException(AccessForbiddenException e) {
return JsonResult.buildErrorStateResult(e.getMessage(), null); return JsonResult.buildErrorStateResult(e.getMessage(), null);
} }
@ExceptionHandler(BizException.class)
public JsonResult<?> handleBizException(BizException e) {
return JsonResult.buildErrorResultWhithCode(e.getMsg(),e.getBusinessCode());
}
} }
package cn.quantgroup.xyqb.controller.req.v2;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class LoginBehavior {
private Integer type;
private JSONObject data;
}
package cn.quantgroup.xyqb.controller.req.v2;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class LoginReq {
@NotNull(message = "登录类型必填")
private Integer type;
private JSONObject data;
private LoginBehavior behavior;
}
package cn.quantgroup.xyqb.controller.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.service.v2.LoginContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/v2/oauth")
public class OauthV2Controller {
private final LoginContext loginContext;
public OauthV2Controller(LoginContext loginContext) {
this.loginContext = loginContext;
}
@PostMapping("/login")
public JsonResult<LoginBean> login(@RequestBody LoginReq loginReq){
return JsonResult.buildSuccessResultGeneric(loginContext.login(loginReq));
}
}
package cn.quantgroup.xyqb.entity.enums;
public enum DataStateEnum {
DISABLE("无效"),
ENABLE("有效");
private final String name;
DataStateEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
package cn.quantgroup.xyqb.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
public class BizException extends RuntimeException {
private String msg;
private String businessCode;
public BizException(BizExceptionEnum bizExceptionEnum) {
this.msg = bizExceptionEnum.getMsg();
this.businessCode = bizExceptionEnum.getBusinessCode();
}
}
package cn.quantgroup.xyqb.exception;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum BizExceptionEnum {
// 登录相关10开通
UN_EXIT_TENANT_ID("1001","租户id不存在"),
UN_EXIT_REGISTERED_FROM("1001","租户id不存在"),
UN_AUTHORIZED("1002","请先登录"),
UN_EXIT_USER("1003","用户不存在"),
ERROR_PASSWORD("1004","用户名或者密码错误");
private final String businessCode;
private final String msg;
}
package cn.quantgroup.xyqb.filter;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import cn.quantgroup.xyqb.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashSet;
public class TokenInterceptor implements HandlerInterceptor {
private final HashSet<String> excludes = new HashSet<>();
private final ISessionService sessionService;
public TokenInterceptor(ISessionService sessionService) {
this.sessionService = sessionService;
excludes.add("/v2/oauth/login");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//所有开放出去的外部接口,都不需要验证租户id和注册来源
String tenantId = request.getHeader(Constants.X_AUTH_TENANT);
String registered_from = request.getHeader(Constants.X_AUTH_FROM);
if (StringUtils.isEmpty(tenantId)) {
throw new BizException(BizExceptionEnum.UN_EXIT_TENANT_ID);
}
if (StringUtils.isEmpty(registered_from)) {
throw new BizException(BizExceptionEnum.UN_EXIT_REGISTERED_FROM);
}
//如果不再排查excludes的接口,需要进一步校验token(说明这些接口需要登录)
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSessionFromRedis();
if (!excludes.contains(request.getRequestURI())) {
if (sessionStruct == null) {
throw new BizException(BizExceptionEnum.UN_AUTHORIZED);
} else {
//session续期
sessionService.persistSession(sessionStruct.getSid(), sessionStruct.getValues(), sessionStruct.getTenantId());
}
} else {
//如果是排除的接口,同时sessionStruct为空,这时候初始化租户和来源字段
if (sessionStruct == null) {
XyqbSessionContextHolder.initXSession();
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
XyqbSessionContextHolder.releaseSession();
}
}
package cn.quantgroup.xyqb.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class LoginBean extends AuthBean{
private Long userId;
private String openId;
private String unionId;
private UserInfo info;
}
...@@ -37,4 +37,11 @@ public class LoginProperties { ...@@ -37,4 +37,11 @@ public class LoginProperties {
private String merchantName = ""; private String merchantName = "";
//租户ID //租户ID
private Integer tenantId; private Integer tenantId;
public LoginProperties(int action, Long createdFrom, Integer tenantId) {
this.action = action;
this.createdFrom = createdFrom;
this.tenantId = tenantId;
}
} }
...@@ -18,6 +18,9 @@ public class SessionStruct implements Serializable { ...@@ -18,6 +18,9 @@ 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 String ip;
public void setAttribute(String key, String value) { public void setAttribute(String key, String value) {
if (value == null) { if (value == null) {
......
package cn.quantgroup.xyqb.model.v2.login;
public class BaseBehaviorParam {
}
package cn.quantgroup.xyqb.model.v2.login;
public class BaseLoginParam {
}
package cn.quantgroup.xyqb.model.v2.login;
public class GeetestBehaviorParam extends BaseBehaviorParam{
}
package cn.quantgroup.xyqb.model.v2.login;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@Data
public class PhonePasswordLoginParam extends BaseLoginParam{
@Size(min = 11,max = 15,message = "手机号码格式不正确")
private String phone;
@Size(min = 5,max = 64,message = "密码格式不正确")
private String password;
@NotNull(message = "密码类型不能为空,默认为0")
private String passwordType;
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginBehavior;
public interface BehaviorStrategy {
Integer getType();
boolean validate(LoginBehavior loginBehavior);
void checkParam(LoginBehavior loginBehavior);
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginBehavior;
/**
* 极验模式
*/
public class GeetestBehaviorStrategy implements BehaviorStrategy{
@Override
public Integer getType() {
return 0;
}
@Override
public boolean validate(LoginBehavior loginBehavior) {
return false;
}
@Override
public void checkParam(LoginBehavior loginBehavior) {
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class LoginContext {
private final Map<Integer, LoginStrategy> loginStrategyMap = new HashMap<>();
private final Map<Integer,BehaviorStrategy> behaviorStrategyMap = new HashMap<>();
public LoginContext(List<LoginStrategy> loginStrategies,List<BehaviorStrategy> behaviorStrategies) {
loginStrategies.forEach(i -> loginStrategyMap.put(i.getType(), i));
behaviorStrategies.forEach(i->behaviorStrategyMap.put(i.getType(), i));
}
public LoginBean login(LoginReq loginReq) {
//第一步、校验参数
LoginStrategy loginStrategy = loginStrategyMap.get(loginReq.getType());
BaseLoginParam loginParam = loginStrategy.checkParam(loginReq);
//第二步、进行行为验证
if(loginReq.getBehavior()!=null){
BehaviorStrategy behaviorStrategy= behaviorStrategyMap.get(loginReq.getBehavior().getType());
behaviorStrategy.checkParam(loginReq.getBehavior());
}
//第三步、执行登录操作
LoginBean loginBean = loginStrategy.login(loginParam);
return loginStrategy.login(loginParam);
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import javax.validation.Validation;
import javax.validation.Validator;
public interface LoginStrategy {
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Integer getType();
LoginBean login(BaseLoginParam param);
BaseLoginParam checkParam(LoginReq loginReq);
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.constant.enums.LoginType;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.model.AuthBean;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.LoginProperties;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import cn.quantgroup.xyqb.model.v2.login.PhonePasswordLoginParam;
import cn.quantgroup.xyqb.repository.IGeetestLogRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.captcha.IGeetestLogService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.ILockIpv4Service;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import cn.quantgroup.xyqb.util.BctyptPasswordUtil;
import cn.quantgroup.xyqb.util.PasswordUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
/**
* 账号密码登录
*/
@Service
public class PhonePasswordLoginStrategy implements LoginStrategy {
private final IUserRepository userRepository;
private final ILockIpv4Service lockIpv4Service;
private final ISessionService sessionService;
private final IGeetestLogService geetestLogService;
public PhonePasswordLoginStrategy(IUserRepository userRepository, ILockIpv4Service lockIpv4Service, ISessionService sessionService, IGeetestLogService geetestLogService) {
this.userRepository = userRepository;
this.lockIpv4Service = lockIpv4Service;
this.sessionService = sessionService;
this.geetestLogService = geetestLogService;
}
@Override
public Integer getType() {
return 3101;
}
@Override
public LoginBean login(BaseLoginParam param) {
PhonePasswordLoginParam phonePasswordLoginParam = (PhonePasswordLoginParam) param;
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSession();
//1、查询库中是否存在用户
User user = userRepository.findByPhoneNoAndTenantId(phonePasswordLoginParam.getPhone(), sessionStruct.getTenantId());
if (user == null) {
// 向该ipv4添加错误计数器
lockIpv4Service.countErrorByIpv4(sessionStruct.getIp());
// 向该phoneNo添加错误计数器
lockIpv4Service.countErrorByPhoneNo(phonePasswordLoginParam.getPhone());
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
// 优先校验新密码加密方式 如果有并且密码校验不通过
if (StringUtils.isNotBlank(user.getCipherPassword())) {
if (!BctyptPasswordUtil.BCryptCheckPw(phonePasswordLoginParam.getPassword(), user.getCipherPassword())) {
// 向该ipv4添加错误计数器
lockIpv4Service.countErrorByIpv4(sessionStruct.getIp());
// 向该phoneNo添加错误计数器
lockIpv4Service.countErrorByPhoneNo(phonePasswordLoginParam.getPhone());
throw new BizException(BizExceptionEnum.ERROR_PASSWORD);
}
} else {
//验证密码
if (!PasswordUtil.validatePassword(phonePasswordLoginParam.getPassword(), user.getPassword())) {
// 向该ipv4添加错误计数器
lockIpv4Service.countErrorByIpv4(sessionStruct.getIp());
// 向该phoneNo添加错误计数器
lockIpv4Service.countErrorByPhoneNo(phonePasswordLoginParam.getPhone());
throw new BizException(BizExceptionEnum.ERROR_PASSWORD);
}
// 校验老密码正确更新新加密方式
user.setCipherPassword(BctyptPasswordUtil.BCryptWithSalt(phonePasswordLoginParam.getPassword()));
userRepository.save(user);
}
// 向该ipv4添加成功计数器
lockIpv4Service.countSuccessByIpv4(sessionStruct.getIp());
//尝试解锁
lockIpv4Service.unLockPhone(phonePasswordLoginParam.getPhone());
LoginProperties loginProperties = new LoginProperties(1,Long.valueOf(sessionStruct.getRegisteredFrom()),sessionStruct.getTenantId());
AuthBean authBean = sessionService.createSession(user, loginProperties, LoginType.ACCOUNTPASSWORD.ordinal(),sessionStruct.getTenantId());
if (authBean != null) {
authBean.setRegister(false);
}
//TODO:统一处理行为验证逻辑
// if (geetestLogId != null) {
// geetestLogService.updateByUidGeetestLog(geetestLogId, user.getId());
// }
return null;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
PhonePasswordLoginParam param = loginReq.getData().toJavaObject(PhonePasswordLoginParam.class);
validator.validate(param);
return param;
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginBehavior;
/**
* 公司自有验证码模式
*/
public class QuantGroupBehaviorStrategy implements BehaviorStrategy{
@Override
public Integer getType() {
return 1;
}
@Override
public boolean validate(LoginBehavior loginBehavior) {
return false;
}
@Override
public void checkParam(LoginBehavior loginBehavior) {
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import org.springframework.stereotype.Service;
/**
* 极光一键登录
*/
@Service
public class SMSDirectJiLoginStrategy implements LoginStrategy{
@Override
public Integer getType() {
return 1201;
}
@Override
public LoginBean login(BaseLoginParam param) {
return null;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
return null;
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import org.springframework.stereotype.Service;
/**
* 短信验证码登录
*/
@Service
public class SMSLoginStrategy implements LoginStrategy{
@Override
public Integer getType() {
return 1101;
}
@Override
public LoginBean login(BaseLoginParam param) {
return null;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
return null;
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import org.springframework.stereotype.Service;
/**
* 微信小程序登录
*/
@Service
public class WechatMiniLoginStrategy implements LoginStrategy{
@Override
public Integer getType() {
return 2101;
}
@Override
public LoginBean login(BaseLoginParam param) {
return null;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
return null;
}
}
package cn.quantgroup.xyqb.service.v2;
import cn.quantgroup.xyqb.controller.req.v2.LoginReq;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.v2.login.BaseLoginParam;
import org.springframework.stereotype.Service;
/**
* 微信小程序手机号码登录
*/
@Service
public class WechatMiniPhoneLoginStrategy implements LoginStrategy {
@Override
public Integer getType() {
return 2102;
}
@Override
public LoginBean login(BaseLoginParam param) {
return null;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
return null;
}
}
...@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.session; ...@@ -3,6 +3,7 @@ package cn.quantgroup.xyqb.session;
import cn.quantgroup.xyqb.Constants; import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.model.session.SessionStruct; import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.session.SessionValue; import cn.quantgroup.xyqb.model.session.SessionValue;
import cn.quantgroup.xyqb.util.IpUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -11,7 +12,6 @@ import org.springframework.web.context.request.RequestContextHolder; ...@@ -11,7 +12,6 @@ import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/** /**
* Created by Miraculous on 2016/12/29. * Created by Miraculous on 2016/12/29.
...@@ -37,6 +37,24 @@ public class XyqbSessionContextHolder { ...@@ -37,6 +37,24 @@ public class XyqbSessionContextHolder {
return sessionStruct; return sessionStruct;
} }
public static SessionStruct initXSession() {
SessionStruct sessionStruct;
if (threadSession.get() != null) {
sessionStruct = threadSession.get();
} else {
sessionStruct = new SessionStruct();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String tenantId = request.getHeader(Constants.X_AUTH_TENANT);
String registered_from = request.getHeader(Constants.X_AUTH_FROM);
String ip = IpUtil.getRemoteIP(request);
sessionStruct.setTenantId(Integer.valueOf(tenantId));
sessionStruct.setRegisteredFrom(Integer.valueOf(registered_from));
sessionStruct.setIp(ip);
threadSession.set(sessionStruct);
}
return sessionStruct;
}
public static SessionStruct getXSessionFromRedis() { public static SessionStruct getXSessionFromRedis() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader(Constants.X_AUTH_TOKEN); String token = request.getHeader(Constants.X_AUTH_TOKEN);
...@@ -52,13 +70,13 @@ public class XyqbSessionContextHolder { ...@@ -52,13 +70,13 @@ public class XyqbSessionContextHolder {
String linkToken = Constants.Session.USER_SESSION_CACHE + token; String linkToken = Constants.Session.USER_SESSION_CACHE + token;
String result = redisTemplate.opsForValue().get(linkToken); String result = redisTemplate.opsForValue().get(linkToken);
if (StringUtils.isEmpty(result)) { if (StringUtils.isEmpty(result)) {
log.warn("[XyqbSessionContextHolder][getXSessionFromRedis] session data 未找到:Tokekn:{},linkTokekn:{},sessionValue:{}", token,linkToken, result); log.warn("[XyqbSessionContextHolder][getXSessionFromRedis] session data 未找到:Tokekn:{},linkTokekn:{},sessionValue:{}", token, linkToken, result);
return null; return null;
} }
try { try {
SessionValue values = JSON.parseObject(result, SessionValue.class); SessionValue values = JSON.parseObject(result, SessionValue.class);
if (values == null) { if (values == null) {
log.warn("[XyqbSessionContextHolder][getXSessionFromRedis] session data 序列化失败:token:{},linkTokekn:{},sessionValue:{}", token, linkToken,result); log.warn("[XyqbSessionContextHolder][getXSessionFromRedis] session data 序列化失败:token:{},linkTokekn:{},sessionValue:{}", token, linkToken, result);
return null; return null;
} }
SessionStruct sessionStruct = new SessionStruct(); SessionStruct sessionStruct = new SessionStruct();
...@@ -67,7 +85,7 @@ public class XyqbSessionContextHolder { ...@@ -67,7 +85,7 @@ public class XyqbSessionContextHolder {
sessionStruct.setExpire(redisTemplate.getExpire(Constants.Session.USER_SESSION_CACHE + token)); sessionStruct.setExpire(redisTemplate.getExpire(Constants.Session.USER_SESSION_CACHE + token));
return sessionStruct; return sessionStruct;
} catch (Exception e) { } catch (Exception e) {
log.warn("[XyqbSessionContextHolder][getXSessionFromRedis] 序列化SessionValue出错:Tokekn:{},linkTokekn:{},sessionValue:{}", token, linkToken,result, e); log.warn("[XyqbSessionContextHolder][getXSessionFromRedis] 序列化SessionValue出错:Tokekn:{},linkTokekn:{},sessionValue:{}", token, linkToken, result, e);
return null; return null;
} }
} }
......
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