Commit a86ff101 authored by 王亮's avatar 王亮

finished internal login.

parent 81634cff
package cn.quantgroup.xyqb.controller.api.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.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("/api/v2/oauth")
public class OauthApiV2Controller {
private final LoginContext loginContext;
public OauthApiV2Controller(LoginContext loginContext) {
this.loginContext = loginContext;
}
/**
* 对外内部登录接口
* @param loginReq LoginReq
* @return JsonResult<LoginBean>
* @see <a href="http://yapi.quantgroups.com/project/17/interface/api/65779">对外统一登录接口</a>
*/
@PostMapping("/login")
public JsonResult<LoginBean> login(@RequestBody LoginReq loginReq){
return JsonResult.buildSuccessResultGeneric(loginContext.login(loginReq));
}
}
......@@ -19,6 +19,8 @@ public enum BizExceptionEnum {
ERROR_DIRECT_LOGIN("1008","极验登录验证失败"),
ERROR_WECHAT_APP_ID("1009","请先配置微信appId"),
ERROR_WECHAT_LOGIN("1010","微信登录失败"),
ERROR_INTERNAL_LOGIN("1011","公开接口不能调用内部登录方式"),
ERROR_LOGIN_PARAM("1012","登录参数异常,请按接口文档对接"),
......
package cn.quantgroup.xyqb.model.v2.login;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 内部模拟登录接口,userId、uuid、openId和appId、unionId和appId不能同时为空
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class InterLoginParam extends BaseLoginParam{
//用户id
private Long userId;
private String uuid;
private String openId;
private String unionId;
private String appId;
}
......@@ -17,6 +17,8 @@ import static org.springframework.transaction.annotation.Propagation.MANDATORY;
*/
public interface IWeChatUserRepository extends JpaRepository<WechatUserInfo, Long> {
WechatUserInfo findByOpenIdAndAppNameAndAppIdAndTenantId(String openId, String appName,String appId,Integer tenantId);
WechatUserInfo findByUnionIdAndAppIdAndTenantId(String openId,String appId,Integer tenantId);
WechatUserInfo findByOpenIdAndAppIdAndTenantId(String openId,String appId,Integer tenantId);
WechatUserInfo findByPhoneNoAndAppNameAndTenantId(String phoneNo, String appName, Integer tenantId);
......
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.entity.WechatUserInfo;
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.InterLoginParam;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.ILockIpv4Service;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* 短信验证码登录
*/
@Service
@Slf4j
public class InterLoginStrategy implements LoginStrategy {
private final ILockIpv4Service lockIpv4Service;
private final IUserService userService;
private final IWechatService wechatService;
private final ISessionService sessionService;
public InterLoginStrategy(ILockIpv4Service lockIpv4Service, IUserService userService, IWechatService wechatService, ISessionService sessionService) {
this.lockIpv4Service = lockIpv4Service;
this.userService = userService;
this.wechatService = wechatService;
this.sessionService = sessionService;
}
@Override
public Integer getType() {
return 9000;
}
@Override
public LoginBean login(BaseLoginParam param) {
InterLoginParam interLoginParam = (InterLoginParam) param;
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSession();
User user = null;
//1、根据前端的条件,进行查询用户信息
if (interLoginParam.getUserId() != null) {
user = userService.findById(interLoginParam.getUserId(), sessionStruct.getTenantId());
}
if (StringUtils.isNotEmpty(interLoginParam.getUuid())) {
user = userService.findByUuidInDb(interLoginParam.getUuid(), sessionStruct.getTenantId());
}
if (StringUtils.isNotEmpty(interLoginParam.getAppId()) && StringUtils.isNotEmpty(interLoginParam.getOpenId())) {
WechatUserInfo wechatUserInfo = wechatService.findWechatUserInfoFromDb(interLoginParam.getOpenId(), interLoginParam.getAppId(), sessionStruct.getTenantId());
if (wechatUserInfo == null || wechatUserInfo.getUserId() == null) {
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
user = userService.findById(wechatUserInfo.getUserId(),sessionStruct.getTenantId());
}
if (StringUtils.isNotEmpty(interLoginParam.getAppId()) && StringUtils.isNotEmpty(interLoginParam.getUnionId())) {
WechatUserInfo wechatUserInfo = wechatService.findByUnionIdAndAppIdAndTenantId(interLoginParam.getUnionId(), interLoginParam.getAppId(), sessionStruct.getTenantId());
if (wechatUserInfo == null || wechatUserInfo.getUserId() == null) {
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
user = userService.findById(wechatUserInfo.getUserId(),sessionStruct.getTenantId());
}
if(user == null){
throw new BizException(BizExceptionEnum.UN_EXIT_USER);
}
//2、需要判断是否是否启用
if (!user.getEnable()) {
log.info("用户不存在,或者已经注销,phoneNo:{}", user.getPhoneNo());
throw new BizException(BizExceptionEnum.ERROR_OR_ENABLE_ERROR);
}
LoginProperties loginProperties = new LoginProperties(1, sessionStruct.getRegisteredFrom(), sessionStruct.getTenantId());
AuthBean authBean = sessionService.createSession(user, loginProperties, LoginType.SUPERLOGIN.ordinal(), sessionStruct.getTenantId());
LoginBean loginBean = new LoginBean();
if (authBean != null) {
loginBean.setToken(authBean.getToken());
loginBean.setPhoneNo(authBean.getPhoneNo());
loginBean.setUuid(authBean.getUuid());
loginBean.setHasPassword(authBean.isHasPassword());
loginBean.setUserId(user.getId());
loginBean.setTenantId(user.getTenantId());
}
loginBean.setRegister(false);
lockIpv4Service.unLockPhone(user.getPhoneNo());
return loginBean;
}
@Override
public BaseLoginParam checkParam(LoginReq loginReq) {
InterLoginParam param = loginReq.getData().toJavaObject(InterLoginParam.class);
if (param.getUserId()==null || StringUtils.isEmpty(param.getUuid())
|| (StringUtils.isEmpty(param.getOpenId()) && StringUtils.isEmpty(param.getAppId())) || (StringUtils.isEmpty(param.getUnionId()) && StringUtils.isEmpty(param.getAppId()))) {
throw new BizException(BizExceptionEnum.ERROR_LOGIN_PARAM);
}
return param;
}
}
......@@ -6,6 +6,8 @@ import cn.quantgroup.xyqb.entity.UserInfoEntity;
import cn.quantgroup.xyqb.entity.UserTag;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.event.UserLoginEvent;
import cn.quantgroup.xyqb.exception.BizException;
import cn.quantgroup.xyqb.exception.BizExceptionEnum;
import cn.quantgroup.xyqb.model.LoginBean;
import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.model.session.SessionStruct;
......@@ -25,7 +27,6 @@ import java.util.Map;
@Service
public class LoginContext {
private final Map<Integer, LoginStrategy> loginStrategyMap = new HashMap<>();
private final ApplicationEventPublisher applicationEventPublisher;
private final IWechatService wechatService;
......@@ -33,17 +34,33 @@ public class LoginContext {
private final IUserInfoRepository userInfoRepository;
private final Map<Integer, LoginStrategy> interloginStrategyMap = new HashMap<>();
public LoginContext(List<LoginStrategy> loginStrategies, ApplicationEventPublisher applicationEventPublisher, IWechatService wechatService, IUserRepository userRepository, IUserInfoRepository userInfoRepository) {
this.applicationEventPublisher = applicationEventPublisher;
this.wechatService = wechatService;
this.userRepository = userRepository;
this.userInfoRepository = userInfoRepository;
loginStrategies.forEach(i -> loginStrategyMap.put(i.getType(), i));
loginStrategies.forEach(i -> interloginStrategyMap.put(i.getType(), i));
}
public LoginBean login(LoginReq loginReq) {
if(loginReq.getType()!=null && loginReq.getType()==9000){
throw new BizException(BizExceptionEnum.ERROR_INTERNAL_LOGIN);
}
return this.interLogin(loginReq);
}
/**
* 内部统一登录
* @param loginReq LoginReq
* @return LoginBean
*/
public LoginBean interLogin(LoginReq loginReq){
//第一步、校验参数
LoginStrategy loginStrategy = loginStrategyMap.get(loginReq.getType());
LoginStrategy loginStrategy = interloginStrategyMap.get(loginReq.getType());
BaseLoginParam loginParam = loginStrategy.checkParam(loginReq);
......
......@@ -15,6 +15,9 @@ public interface IWechatService {
WechatUserInfo findWechatUserInfoFromDb(String openId,String appId,Integer tenantId);
WechatUserInfo findByUnionIdAndAppIdAndTenantId(String unionId,String appId,Integer tenantId);
WechatUserInfo findWechatUserInfoByPhoneNo(String phoneNo, Integer tenantId);
WechatUserInfo saveWechatUserInfo(WechatUserInfo userInfo);
......
......@@ -116,6 +116,12 @@ public class WechatServiceImpl implements IWechatService {
return weChatUserRepository.findByOpenIdAndAppNameAndAppIdAndTenantId(openId, "xyqb",appId,tenantId);
}
@Override
public WechatUserInfo findByUnionIdAndAppIdAndTenantId(String openId,String appId,Integer tenantId) {
return weChatUserRepository.findByUnionIdAndAppIdAndTenantId(openId,appId,tenantId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public WechatUserInfo saveWechatUserInfo(WechatUserInfo userInfo) {
......
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