Commit fb50963b authored by shangying's avatar shangying

Merge remote-tracking branch 'remotes/origin/master' into oneclickdatanew

# Conflicts:
#	src/main/java/cn/quantgroup/cashloanflowboss/api/order/service/OrderServiceImpl.java
parents 387bd728 65ad7c50
......@@ -51,7 +51,7 @@ public class ChannelConf extends Primary {
private Integer p2pFundId;
/**
* p2p资方id
* xyqb productId
*/
@Column(name = "biz_type")
private Integer bizType;
......
......@@ -18,6 +18,9 @@ public class ChannelConfBaseModel {
private String env;
private Integer fundId;
private Integer p2pFundId;
/**
* 对应productId
*/
private Integer bizType;
private String aesKey;
private String md5Key;
......
......@@ -77,6 +77,7 @@ public class ChannelConfUtil {
channelConfiguration.setMd5Key(basicInfo.getMd5Key());
channelConfiguration.setSpiderCenterChannelCode(basicInfo.getRiskCode());
channelConfiguration.setSpiderCenterMerchantChannelCode(basicInfo.getAuthCode());
channelConfiguration.setXyqbProductId(basicInfo.getBizType()+"");
return channelConfiguration;
}
......@@ -101,27 +102,25 @@ public class ChannelConfUtil {
public static List<ClfOrderCallBack> convert2ClfOrderCallback(Long channelId, ChannelConfAddModel addModel) {
List<ClfOrderCallBack> list = new ArrayList<>();
if (StringUtils.isNotEmpty(addModel.getApproveCallBackUrl())) {
//审批
ClfOrderCallBack clfOrderCallBack1 = new ClfOrderCallBack();
clfOrderCallBack1.setCallbackStatus(KANoticeType.FUAD_ASSIFN_SUCC);
clfOrderCallBack1.setRegisteredFrom(channelId);
clfOrderCallBack1.setCallbackUrl(addModel.getApproveCallBackUrl());
clfOrderCallBack1.setIsActive(true);
clfOrderCallBack1.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack1);
approveCallbackUrl(channelId, addModel, list);
ClfOrderCallBack clfOrderCallBack2 = new ClfOrderCallBack();
clfOrderCallBack2.setCallbackStatus(KANoticeType.REJECT);
clfOrderCallBack2.setRegisteredFrom(channelId);
clfOrderCallBack2.setCallbackUrl(addModel.getApproveCallBackUrl());
clfOrderCallBack2.setIsActive(true);
clfOrderCallBack2.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack2);
orderStatusOrderCallback(channelId, addModel, list);
if (StringUtils.isNotEmpty(addModel.getRepaymentPlanCallBackUrl())) {
ClfOrderCallBack clfOrderCallBack10 = new ClfOrderCallBack();
clfOrderCallBack10.setCallbackStatus(KANoticeType.REPAYMENT);
clfOrderCallBack10.setRegisteredFrom(channelId);
clfOrderCallBack10.setCallbackUrl(addModel.getRepaymentPlanCallBackUrl());
clfOrderCallBack10.setIsActive(true);
clfOrderCallBack10.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack10);
}
if (StringUtils.isNotEmpty(addModel.getOrderStatusCallBackUrl())) {
return list;
}
private static void orderStatusOrderCallback(Long channelId, ChannelConfAddModel addModel, List<ClfOrderCallBack> list) {
if (StringUtils.isNotEmpty(addModel.getOrderStatusCallBackUrl())) {
// 状态
ClfOrderCallBack clfOrderCallBack0 = new ClfOrderCallBack();
clfOrderCallBack0.setCallbackStatus(KANoticeType.CREDIT_SUCC);
......@@ -187,18 +186,27 @@ public class ChannelConfUtil {
clfOrderCallBack9.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack9);
}
}
if (StringUtils.isNotEmpty(addModel.getRepaymentPlanCallBackUrl())) {
ClfOrderCallBack clfOrderCallBack10 = new ClfOrderCallBack();
clfOrderCallBack10.setCallbackStatus(KANoticeType.REPAYMENT);
clfOrderCallBack10.setRegisteredFrom(channelId);
clfOrderCallBack10.setCallbackUrl(addModel.getRepaymentPlanCallBackUrl());
clfOrderCallBack10.setIsActive(true);
clfOrderCallBack10.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack10);
}
private static void approveCallbackUrl(Long channelId, ChannelConfAddModel addModel, List<ClfOrderCallBack> list) {
if (StringUtils.isNotEmpty(addModel.getApproveCallBackUrl())) {
//审批
ClfOrderCallBack clfOrderCallBack1 = new ClfOrderCallBack();
clfOrderCallBack1.setCallbackStatus(KANoticeType.FUAD_ASSIFN_SUCC);
clfOrderCallBack1.setRegisteredFrom(channelId);
clfOrderCallBack1.setCallbackUrl(addModel.getApproveCallBackUrl());
clfOrderCallBack1.setIsActive(true);
clfOrderCallBack1.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack1);
return list;
ClfOrderCallBack clfOrderCallBack2 = new ClfOrderCallBack();
clfOrderCallBack2.setCallbackStatus(KANoticeType.REJECT);
clfOrderCallBack2.setRegisteredFrom(channelId);
clfOrderCallBack2.setCallbackUrl(addModel.getApproveCallBackUrl());
clfOrderCallBack2.setIsActive(true);
clfOrderCallBack2.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack2);
}
}
public static Integer getFundIdByType(Integer fundType, ChannelConf channelConf) {
......@@ -219,7 +227,7 @@ public class ChannelConfUtil {
channelConfBaseModel.setEnv("");
channelConfBaseModel.setFundId(0);
channelConfBaseModel.setP2pFundId(0);
channelConfBaseModel.setBizType(0);
channelConfBaseModel.setBizType(Integer.valueOf(channelConfiguration.getXyqbProductId()));
channelConfBaseModel.setAesKey(channelConfiguration.getAesKey());
channelConfBaseModel.setMd5Key(channelConfiguration.getMd5Key());
channelConfBaseModel.setAuthCode(channelConfiguration.getSpiderCenterMerchantChannelCode());
......
......@@ -4,8 +4,11 @@ import cn.quantgroup.cashloanflowboss.api.login.model.LoginFormModel;
import cn.quantgroup.cashloanflowboss.api.login.service.LoginService;
import cn.quantgroup.cashloanflowboss.component.security.Authority;
import cn.quantgroup.cashloanflowboss.component.security.annotiation.Security;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -31,7 +34,12 @@ public class LogController {
*/
@PostMapping("/login")
public Result<String> login(@RequestBody @Valid LoginFormModel loginFormModel) {
return new Result<>(ApplicationStatus.SUCCESS, this.loginService.login(loginFormModel.getUsername(), loginFormModel.getPassword()));
Tuple<Boolean, ApplicationStatus> tuple = this.loginService.login(loginFormModel.getUsername(), loginFormModel.getPassword());
if (BooleanUtils.isTrue(tuple.getKey())) {
return new Result<>(ApplicationStatus.SUCCESS, Application.getSession().getId());
} else {
return new Result<>(tuple.getValue(), "");
}
}
/**
......
package cn.quantgroup.cashloanflowboss.api.login.service;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import java.util.Map;
/**
......@@ -9,7 +12,7 @@ import java.util.Map;
* @author: suntao
*/
public interface LoginService {
String login(String username, String password);
Tuple<Boolean, ApplicationStatus> login(String username, String password);
boolean logout();
......
......@@ -7,6 +7,7 @@ import cn.quantgroup.cashloanflowboss.api.user.model.UserInfo;
import cn.quantgroup.cashloanflowboss.api.user.service.UserService;
import cn.quantgroup.cashloanflowboss.api.user.service.UserServiceImpl;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationDictionary;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
......@@ -47,18 +48,28 @@ public class LoginServiceImpl implements LoginService {
* @return
*/
@Override
public String login(String username, String password) {
public Tuple<Boolean, ApplicationStatus> login(String username, String password) {
User user = this.userService.getUser(username);
// 检查用户是否有效
Assert.isNull(user, ApplicationStatus.INVALID_USER);
if (user == null) {
log.info("用户不存在username=" + username);
return new Tuple<>(Boolean.FALSE, ApplicationStatus.INVALID_USER);
}
// 检查用户是否被禁用
Assert.isTrue(UserStatus.DISABLED.equals(user.getStatus()), ApplicationStatus.DISABLED_USER);
if (UserStatus.DISABLED.equals(user.getStatus())) {
log.info("用户已禁用username=" + username);
return new Tuple<>(Boolean.FALSE, ApplicationStatus.DISABLED_USER);
}
// 检查密码是否正确
Assert.isFalse(user.getPassword().equalsIgnoreCase(MD5Tools.md5(password)), ApplicationStatus.USERNAME_OR_PASSWORD_ERROR);
final String passwordMd5 = MD5Tools.md5(password);
if (!user.getPassword().equalsIgnoreCase(passwordMd5)) {
log.info("用户名或密码错误username=" + username);
return new Tuple<>(Boolean.FALSE, ApplicationStatus.USERNAME_OR_PASSWORD_ERROR);
}
// 创建Session
HttpSession session = this.request.getSession(true);
......@@ -85,9 +96,8 @@ public class LoginServiceImpl implements LoginService {
// 保存用户最后登陆时间
user.setLastLoginTime(new Date());
userService.updateUser(user);
return session.getId();
log.info("登陆成功sessionId="+ session.getId());
return new Tuple<>(Boolean.TRUE, ApplicationStatus.SUCCESS);
}
/**
......
......@@ -33,10 +33,10 @@ public interface OrderService {
* @param channelOrderNumber
* @return 《是否成功 , msg》
*/
@Transactional
@Transactional(rollbackFor = Exception.class)
Tuple<Boolean, String> secondAudit(String channelOrderNumber);
@Transactional
@Transactional(rollbackFor = Exception.class)
Tuple<Boolean, String> lending(LendingFormModel lendingFormModel);
HistoryOrderStatusVoModel getOrderHistoryStatus(String channelOrderNumber);
......
......@@ -2,7 +2,6 @@ package cn.quantgroup.cashloanflowboss.api.user.model;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.api.role.entity.Role;
import cn.quantgroup.cashloanflowboss.api.user.entity.User;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import com.google.common.collect.Lists;
......@@ -20,10 +19,10 @@ public class UserDetailInfo {
@Data
static class RoleInfo {
List<roleView> roleInfos;
List<RoleView> roleInfos;
@Data
static class roleView {
static class RoleView {
private Long roleId;
private String roleName;
}
......@@ -40,9 +39,9 @@ public class UserDetailInfo {
if (null != roles && roles.size() > 0) {
RoleInfo roleInfo = new RoleInfo();
List<RoleInfo.roleView> roleInfos = Lists.newArrayList();
List<RoleInfo.RoleView> roleInfos = Lists.newArrayList();
roles.forEach(role -> {
RoleInfo.roleView roleView = new RoleInfo.roleView();
RoleInfo.RoleView roleView = new RoleInfo.RoleView();
roleView.setRoleId(role.getId());
roleView.setRoleName(role.getName());
roleInfos.add(roleView);
......
......@@ -185,7 +185,11 @@ public class UserServiceImpl implements UserService{
public User saveUserInfo(UserInfoModel userInfoModel) {
User user1 = new User();
BeanUtils.copyProperties(userInfoModel, user1);
user1.setPassword(MD5Tools.md5(userInfoModel.getUsername()));
if (StringUtils.isEmpty(userInfoModel.getPassword())) {
user1.setPassword(MD5Tools.md5(userInfoModel.getUsername()));
} else {
user1.setPassword(MD5Tools.md5(userInfoModel.getPassword()));
}
user1.setRoles(userInfoModel.getRoles());
return userRepository.save(user1);
}
......
package cn.quantgroup.cashloanflowboss.component.security;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import org.aopalliance.intercept.MethodInvocation;
/**
......@@ -8,5 +10,5 @@ import org.aopalliance.intercept.MethodInvocation;
* Created by WeiWei on 2018/12/24.
*/
public interface SecurityHandler {
boolean doAuthentication(final MethodInvocation invocation, String authorityId, Authority[] authority) throws Throwable;
Tuple<Boolean, ApplicationStatus> doAuthentication(final MethodInvocation invocation, String authorityId, Authority[] authority) throws Throwable;
}
\ No newline at end of file
......@@ -2,9 +2,11 @@ package cn.quantgroup.cashloanflowboss.component.security;
import cn.quantgroup.cashloanflowboss.component.security.annotiation.Security;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.context.support.ApplicationObjectSupport;
import java.io.Serializable;
......@@ -18,9 +20,10 @@ public class SecurityInterceptor extends ApplicationObjectSupport implements Met
public Object invoke(final MethodInvocation invocation) throws Throwable {
Security security = invocation.getMethod().getAnnotation(Security.class);
if (!this.getApplicationContext().getBean(SecurityHandler.class).doAuthentication(invocation, security.authorityId(), security.authorities())) {
return Result.buildFail(ApplicationStatus.INVALID_AUTHORITY);
Tuple<Boolean, ApplicationStatus> doAuthentication = this.getApplicationContext().getBean(SecurityHandler.class).doAuthentication(invocation, security.authorityId(), security.authorities());
if (BooleanUtils.isFalse(doAuthentication.getKey())) {
// 未通过验证
return Result.buildFail(doAuthentication.getValue());
}
return invocation.proceed();
......
......@@ -23,6 +23,9 @@ import java.util.regex.Pattern;
*/
public class IDValidator {
private static final int int17 = 17;
private static final String s19 = "19";
/**
* 校验码
*/
......@@ -96,11 +99,11 @@ public class IDValidator {
return false;
}
if (Pattern.matches("^[\\d]{15}$", idNumber)) {
if (Pattern.matches(getRegex(), idNumber)) {
return this.validate15(idNumber);
} else if (Pattern.matches("^([\\d]{17}((?i)X))|([\\d]{18})$", idNumber)) {
} else if (Pattern.matches(getRegex2(), idNumber)) {
return this.validate18(idNumber);
......@@ -110,6 +113,14 @@ public class IDValidator {
}
private String getRegex2() {
return "^([\\d]{17}((?i)X))|([\\d]{18})$";
}
private String getRegex() {
return "^[\\d]{15}$";
}
/**
* 验证15位身份证号
*
......@@ -137,12 +148,12 @@ public class IDValidator {
*/
private String convert(String idNumber) {
String newIdNumber = idNumber.substring(0, 6) + "19" + idNumber.substring(6);
String newIdNumber = idNumber.substring(0, 6) + s19 + idNumber.substring(6);
// 校验码
int sum = 0;
for (int i = 0; i < 17; i++) {
for (int i = 0; i < int17; i++) {
int ai = Integer.parseInt(String.valueOf(newIdNumber.charAt(i)));
sum = sum + ai * weights[i];
}
......@@ -219,7 +230,7 @@ public class IDValidator {
int sum = 0;
for (int i = 0; i < 17; i++) {
for (int i = 0; i < int17; i++) {
sum = sum + Integer.parseInt(String.valueOf(idNumber.charAt(i))) * weights[i];
}
......
......@@ -2,7 +2,9 @@ package cn.quantgroup.cashloanflowboss.core;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationDictionary;
import cn.quantgroup.cashloanflowboss.utils.IpUtil;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
......@@ -24,6 +26,7 @@ import java.util.concurrent.ConcurrentHashMap;
/**
* Created by WeiWei on 2017/5/23.
*/
@Slf4j
@Component
public class Application implements ApplicationContextAware, ServletContextAware {
......@@ -170,9 +173,15 @@ public class Application implements ApplicationContextAware, ServletContextAware
* @return
*/
public static Principal getPrincipal() {
return Objects.nonNull(getSession()) ? JSONTools.deserialize(String.valueOf(getSession().getAttribute(ApplicationDictionary.PRINCIPAL)), Principal.class) : null;
HttpSession session = getSession();
if (Objects.nonNull(session)) {
Principal principal = JSONTools.deserialize(String.valueOf(session.getAttribute(ApplicationDictionary.PRINCIPAL)), Principal.class);
// log.info("后来访问获取sessionId={},userName={}", session.getId(), principal != null ? principal.getUserInfo().getUsername() : "null");
return principal;
} else {
log.info("后来访问获取session为空");
return null;
}
}
/**
* 获取用户主要信息
......@@ -182,9 +191,14 @@ public class Application implements ApplicationContextAware, ServletContextAware
public static HttpSession getSession() {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return Objects.nonNull(request) && Objects.nonNull(request.getSession()) ? request.getSession() : null;
if (Objects.nonNull(request)) {
HttpSession session = request.getSession();
if (Objects.nonNull(session)) {
// log.info("后来访问获取sessionId={},requestIp={}", session.getId(), IpUtil.getRemoteIP(request));
return session;
}
}
return null;
}
}
\ No newline at end of file
......@@ -4,6 +4,7 @@ import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.constants.Constants;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
......@@ -43,7 +44,6 @@ public class ChannelRoleCheckAspect {
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
/**
* 通过 channelId 或者 channelOrderNumber 判断 如果是渠道用户登陆 是否当前渠道
* @param pjp
......@@ -75,7 +75,7 @@ public class ChannelRoleCheckAspect {
if (StringUtils.isNotEmpty(channelIdSPEL)) {
// 通过channelId 判断
try {
if (channelIdSPEL.startsWith("#this")) {
if (channelIdSPEL.startsWith(Constants.START_THIS)) {
Expression expression = new SpelExpressionParser().parseExpression(channelIdSPEL);
if (!Application.getPrincipal().getChannelId().equals(expression.getValue(args, Long.class))) {
......@@ -92,7 +92,7 @@ public class ChannelRoleCheckAspect {
} else if (StringUtils.isNotEmpty(channelOrderNumberSPEL)){
// 通过channelOrderNumber 判断
String channelOrderNumber = "";
if (channelOrderNumberSPEL.startsWith("#this")) {
if (channelOrderNumberSPEL.startsWith(Constants.START_THIS)) {
Expression expression = new SpelExpressionParser().parseExpression(channelOrderNumberSPEL);
channelOrderNumber = expression.getValue(args, String.class);
} else {
......
......@@ -4,6 +4,7 @@ import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.constants.Constants;
import cn.quantgroup.cashloanflowboss.core.exception.ApplicationException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -59,7 +60,7 @@ public class ChannelRoleLoadAspect {
if (principal.isChannel()) {
if (StringUtils.isNotEmpty(channelIdSPEL)) {
try {
if (channelIdSPEL.startsWith("#this")) {//判断是否是spel表达式
if (channelIdSPEL.startsWith(Constants.START_THIS)) {//判断是否是spel表达式
Expression expression = new SpelExpressionParser().parseExpression(channelIdSPEL);
expression.setValue(args, principal.getChannelId());
} else {
......
......@@ -6,6 +6,7 @@ import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.opt.OperationAnno;
import cn.quantgroup.cashloanflowboss.core.constants.Constants;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import lombok.extern.slf4j.Slf4j;
......@@ -52,23 +53,19 @@ public class OperationAspect {
*/
@Around("operationAnno()")
private Object operationAnnoAndSave(ProceedingJoinPoint pjp) throws Throwable {
try {
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method method = methodSignature.getMethod();
OperationAnno annotation = method.getAnnotation(OperationAnno.class);
Object[] args = pjp.getArgs();
OptEnumName opt = annotation.opt();
String succSPEL = annotation.succSPEL();
String optDetailSPEL = annotation.optDetailSPEL();
String channelOrderNumber = "";
if (StringUtils.isNotBlank(annotation.channelNo())) {
String keySPEL = annotation.channelNo();
try {
if (keySPEL.startsWith("#this")) {//判断是否是spel表达式
if (keySPEL.startsWith(Constants.START_THIS)) {//判断是否是spel表达式
Expression expression = new SpelExpressionParser().parseExpression(keySPEL);
String value = expression.getValue(args, String.class);
channelOrderNumber = value;
......@@ -85,14 +82,7 @@ public class OperationAspect {
ClfOrderMapping orderMapping = clfCenterService.findOrderMappingByChannelOrderNo(channelOrderNumber);
if (orderMapping != null) {
// do some
optHistoryLog.setChannelOrderNumber(channelOrderNumber);
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(orderMapping.getRegisteredFrom());
optHistoryLog.setOptEnumName(opt);
optHistoryLog.setOptName(opt.getDesc());
optHistoryLog.setOptUser(Application.getPrincipal().getUserInfo().getNickname() + "_" + Application.getPrincipal().getUserInfo().getUsername());
optHistoryLog.setCreateTime(new Date());
getOptHistoryLogBean(opt, channelOrderNumber, optHistoryLog, orderMapping);
} else {
log.warn("[operationAnnoAnnSave]orderMapping is null, channelOrderNumber={}" , channelOrderNumber );
return pjp.proceed();
......@@ -101,36 +91,8 @@ public class OperationAspect {
log.warn("[operationAnnoAnnSave]channelOrderNumber is empty, channelOrderNumber={}" , channelOrderNumber );
return pjp.proceed();
}
// 是否成功SPEL 表达式解析
Expression expressionsuccSPEL = null;
if (StringUtils.isNotEmpty(succSPEL)) {
try {
if (succSPEL.startsWith("#this")) {//判断是否是spel表达式
expressionsuccSPEL = new SpelExpressionParser().parseExpression(succSPEL);
} else {
log.warn("[operationAnnoAnnSave]optResult获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + succSPEL + "”错误:{}", e);
throw e;
}
}
Expression expressionMsgSPEL = null;
if (StringUtils.isNotEmpty(optDetailSPEL)) {
try {
if (optDetailSPEL.startsWith("#this")) {//判断是否是spel表达式
expressionMsgSPEL = new SpelExpressionParser().parseExpression(optDetailSPEL);
} else {
log.warn("[operationAnnoAnnSave]optDetail获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + optDetailSPEL + "”错误:{}", e);
throw e;
}
}
Expression expressionsuccSPEL = getIsSuccExpressionSPEL(succSPEL);
Expression expressionMsgSPEL = getMegExpression(optDetailSPEL);
if (StringUtils.isNotEmpty(channelOrderNumber)) {
// 判断是否 已经请求成功过
OptHistoryLog optHistoryLogSuccess = optHistoryLogService.findByChannelOrderNumberAndOptNameAndSuccess(channelOrderNumber, opt);
......@@ -148,23 +110,17 @@ public class OperationAspect {
log.info("[operationAnnoAnnSave]该操作已经操作成功,无须重复操作,切面返回");
return ret;
}
}
}
// 代理执行方法
Object proceed = pjp.proceed();
// 获取方法返回 是否成功
if (expressionsuccSPEL != null) {
optHistoryLog.setOptResult(expressionsuccSPEL.getValue(proceed, Boolean.class));
}
// 获取方法详细信息
if (expressionMsgSPEL != null) {
optHistoryLog.setOptLogDetail(expressionMsgSPEL.getValue(proceed, String.class));
}
optHistoryLogService.save(optHistoryLog);
return proceed;
} catch (Throwable throwable) {
......@@ -172,4 +128,50 @@ public class OperationAspect {
return pjp.proceed();
}
}
private void getOptHistoryLogBean(OptEnumName opt, String channelOrderNumber, OptHistoryLog optHistoryLog, ClfOrderMapping orderMapping) {
optHistoryLog.setChannelOrderNumber(channelOrderNumber);
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(orderMapping.getRegisteredFrom());
optHistoryLog.setOptEnumName(opt);
optHistoryLog.setOptName(opt.getDesc());
optHistoryLog.setOptUser(Application.getPrincipal().getUserInfo().getNickname() + "_" + Application.getPrincipal().getUserInfo().getUsername());
optHistoryLog.setCreateTime(new Date());
}
private Expression getMegExpression(String optDetailSPEL) {
Expression expressionMsgSPEL = null;
if (StringUtils.isNotEmpty(optDetailSPEL)) {
try {
if (optDetailSPEL.startsWith(Constants.START_THIS)) {//判断是否是spel表达式
expressionMsgSPEL = new SpelExpressionParser().parseExpression(optDetailSPEL);
} else {
log.warn("[operationAnnoAnnSave]optDetail获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + optDetailSPEL + "”错误:{}", e);
throw e;
}
}
return expressionMsgSPEL;
}
private Expression getIsSuccExpressionSPEL(String succSPEL) {
// 是否成功SPEL 表达式解析
Expression expressionsuccSPEL = null;
if (StringUtils.isNotEmpty(succSPEL)) {
try {
if (succSPEL.startsWith(Constants.START_THIS)) {//判断是否是spel表达式
expressionsuccSPEL = new SpelExpressionParser().parseExpression(succSPEL);
} else {
log.warn("[operationAnnoAnnSave]optResult获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + succSPEL + "”错误:{}", e);
throw e;
}
}
return expressionsuccSPEL;
}
}
......@@ -325,26 +325,22 @@ public class Assert {
public static Boolean isLastLogin(Map<String, Object> concurrentHashMapLoginInfo) {
HttpSession session = Application.getSession();
if (Objects.isNull(session)) {
System.out.println("session 为空");
return false;
}
Principal principal = Application.getPrincipal();
if (Objects.isNull(principal)) {
System.out.println("principal 为空");
return false;
}
Object userLastLoginTimeObject = concurrentHashMapLoginInfo.get(principal.getUserInfo().getUserId()+"");
if (Objects.isNull(userLastLoginTimeObject)) {
// 没有登陆时间 不处理
System.out.println("userLastLoginTimeObject 为空");
return false;
}
// 获取session最后登陆时间
Object creationTimeObject = session.getAttribute(ApplicationDictionary.USER_SESSION_LOGIN_TIME);
if (Objects.isNull(creationTimeObject)) {
System.out.println("lastAccessedTime 为空");
return false;
}
......
......@@ -8,10 +8,13 @@ import cn.quantgroup.cashloanflowboss.component.security.Authority;
import cn.quantgroup.cashloanflowboss.component.security.SecurityHandler;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.core.exception.ApplicationException;
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
......@@ -22,6 +25,7 @@ import java.util.List;
/**
* Created by WeiWei on 2019/7/26.
*/
@Slf4j
@Configuration
public class ApplicationSecurityHandler implements SecurityHandler {
......@@ -29,31 +33,41 @@ public class ApplicationSecurityHandler implements SecurityHandler {
private LoginService loginService;
@Override
public boolean doAuthentication(MethodInvocation invocation, String authorityId, Authority[] authority) throws Throwable {
public Tuple<Boolean, ApplicationStatus> doAuthentication(MethodInvocation invocation, String authorityId, Authority[] authority) {
Principal principal = Application.getPrincipal();
// 检查是否已登录
Assert.isNull(principal, ApplicationStatus.AUTHENTICATION_LOGIN);
if (principal == null) {
log.info("未曾登陆,需要重新登陆");
return new Tuple<>(Boolean.FALSE, ApplicationStatus.AUTHENTICATION_LOGIN);
}
// 是否 被挤下线
Boolean isLogin = Assert.isLastLogin(loginService.getConcurrentHashMapLoginInfo());
if (isLogin != null && isLogin) {
if (BooleanUtils.isTrue(isLogin)) {
log.info("已在其他地方登陆,需要重新登陆,userName=" + principal.getUserInfo().getUsername());
// 退出登陆
loginService.logout();
// 返回 信息
throw new ApplicationException(ApplicationStatus.AUTHENTICATION_LOGIN_CROWD_OUT);
return new Tuple<>(Boolean.FALSE, ApplicationStatus.AUTHENTICATION_LOGIN_CROWD_OUT);
}
// 如果是超级管理员跳过权限验证
return principal.isSuperAdministrator() || principal.getRoles().stream().anyMatch(role -> {
boolean hasPrivilege = principal.isSuperAdministrator() || principal.getRoles().stream().anyMatch(role -> {
List<Role> roleList = getRoleAndParent(role);
if (CollectionUtils.isEmpty(roleList)) {
return false;
}
return roleList.stream().anyMatch(_role -> this.checkAuthority(authorityId, _role));
return roleList.stream().anyMatch(roleItem -> this.checkAuthority(authorityId, roleItem));
});
if (hasPrivilege) {
return new Tuple<>(Boolean.TRUE, null);
} else {
log.info("权限不足,userName={},authorityId={}" + principal.getUserInfo().getUsername(), authorityId);
return new Tuple<>(Boolean.FALSE, ApplicationStatus.INVALID_AUTHORITY);
}
}
......
package cn.quantgroup.cashloanflowboss.core.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* function:
* date: 2019/8/20
......@@ -11,7 +18,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
* @author: suntao
*/
@Configuration
public class CorsConfiguration extends WebMvcConfigurerAdapter {
public class BossCorsConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
......@@ -23,4 +30,24 @@ public class CorsConfiguration extends WebMvcConfigurerAdapter {
}
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
List<String> list = new ArrayList<>();
list.add("*");
corsConfiguration.setAllowedOrigins(list);
/*
// 请求常用的三种配置,*代表允许所有,当时你也可以自定义属性(比如header只能带什么,只能是post方式等等)
*/
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
//@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
}
package cn.quantgroup.cashloanflowboss.core.constants;
/**
* @description:
* @author:tao
* @create: 2019-12-26 14:35
*/
public interface Constants {
String SUCCESS = "success";
String TOTAL_COUNT = "totalCount";
String TOTAL_AMOUNT = "totalAmount";
String DATA = "data";
String TOKEN = "token";
String TRUE = "true";
String START_THIS = "#this";
}
......@@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional;
@Repository
public interface UserDetailRepository extends JpaRepository<UserDetail,Long>{
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "delete from user_detail where user_id = ?1", nativeQuery = true)
int deleteByUserId(Long userId);
......
......@@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional;
@Repository
public interface UserExtInfoRepository extends JpaRepository<UserExtInfo,Long>{
@Transactional
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "delete from user_ext_info where user_id = ?1", nativeQuery = true)
void deleteByUserId(Long userId);
......
......@@ -37,7 +37,7 @@ public interface XYQBCenterService {
WaitingFundingCorpOperatePeople findWaitingFundingCorpOperatePeopleByLoanId(Long loanId);
@Transactional
@Transactional(rollbackOn = Exception.class)
void saveWaitingFundingCorpOperatePeople(WaitingFundingCorpOperatePeople waitingFundingCorpOperatePeople);
FundingCorpPolicy findFundingCorpPolicyByCorpPolicyId(Long corpPolicyId);
......
package cn.quantgroup.cashloanflowboss.utils;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
/**
* IP地址工具类
* @author mengfan.feng
* @time 2015-10-27 11:41
*/
public class IpUtil {
/**
* 通过指定请求获得对应的远程ip地址
* @param request
* @return
*/
public static String getRemoteIP(HttpServletRequest request) {
String ip = request.getHeader("x-real-ip");
if (StringUtils.isEmpty(ip)) {
ip = request.getRemoteAddr();
}
//过滤反向代理的ip
String[] stemps = ip.split(",");
if (stemps != null && stemps.length >= 1) {
//得到第一个IP,即客户端真实IP
ip = stemps[0];
}
ip = ip.trim();
int length = 23;
if (ip.length() > length) {
ip = ip.substring(0, 23);
}
return ip;
}
}
......@@ -5,6 +5,7 @@ import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.core.exception.ApplicationException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
......@@ -25,10 +26,10 @@ import java.util.Objects;
*/
public class JSONTools {
private static final ObjectMapper objectMapper;
private static final ObjectMapper objectMapper = new ObjectMapper();
static {
objectMapper = Application.getBean(ObjectMapper.class);
// json 多属性 忽略
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/**
......
CREATE DATABASE IF NOT EXISTS cash_loan_flow_boss CHARACTER SET utf8 COLLATE utf8_general_ci;
use cash_loan_flow_boss;
CREATE TABLE IF NOT EXISTS `channel_conf` (
......
package cn.quantgroup.cashloanflowboss.json;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbCurrentOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.api.permissionmodule.entity.Permission;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.fasterxml.jackson.core.type.TypeReference;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
/**
* @description: test
* @author:tao
* @create: 2019-12-24 17:43
*/
public class JsonTest {
@Test
public void test() {
String str = "{\"code\":0,\"message\":null,\"data\":{\"currentStatus\":{\"status\":\"APPROVE_ING\",\"updateTime\":1577084363000,\"kaNoticeType\":\"APPROVE_ING\"}},\"success\":true}";
TypeReference<ServiceResult<XyqbCurrentOrderStatusServiceResultModel>> typeReference = new TypeReference<ServiceResult<XyqbCurrentOrderStatusServiceResultModel>>() {
};
ServiceResult<XyqbCurrentOrderStatusServiceResultModel> serviceResult = JSONTools.deserialize(str, typeReference);
System.out.println(serviceResult);
}
}
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