| | |
| | | if (loginBody.getMobile()) { |
| | | token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getType(), loginBody.getCode(), loginBody.getUuid(),hospId); |
| | | } else { |
| | | token = loginService.Cuslogin(loginBody.getUsername(),loginBody.getSfzh(),loginBody.getPassword(), loginBody.getType(), loginBody.getCode(), loginBody.getUuid()); |
| | | token = loginService.Cuslogin(loginBody.getUsername(),loginBody.getSfzh(),loginBody.getPassword(), loginBody.getType(), loginBody.getCode(), loginBody.getUuid(),hospId); |
| | | LambdaQueryWrapper<TjCustomer> wq = new LambdaQueryWrapper<>(); |
| | | wq.eq(TjCustomer::getCusPhone, loginBody.getUsername()); |
| | | TjCustomer tjCustomer = customerService.getOne(wq); |
| | |
| | | * @author ltkj |
| | | */ |
| | | public class CacheConstants { |
| | | |
| | | |
| | | |
| | | /** |
| | | * 登录用户 redis key |
| | | */ |
| | |
| | | // 处理设置注解上的参数 |
| | | getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); |
| | | // 保存数据库 |
| | | AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); |
| | | // AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); |
| | | AsyncFactory.recordOper(operLog); |
| | | } catch (Exception exp) { |
| | | // 记录本地异常日志 |
| | | log.error("==前置通知异常=="); |
| | |
| | | package com.ltkj.framework.manager.factory; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.TimerTask; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.ltkj.db.DataSourceConfig; |
| | | import com.ltkj.db.DataSourceContextHolder; |
| | | import com.ltkj.hosp.domain.DictHosp; |
| | | import com.ltkj.hosp.service.IDictHospService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import com.ltkj.common.constant.Constants; |
| | |
| | | import com.ltkj.system.service.ISysLogininforService; |
| | | import com.ltkj.system.service.ISysOperLogService; |
| | | import eu.bitwalker.useragentutils.UserAgent; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | /** |
| | | * 异步工厂(产生任务用) |
| | | * |
| | | * @author ltkj |
| | | */ |
| | | //@Component |
| | | @Slf4j |
| | | public class AsyncFactory { |
| | | private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); |
| | | |
| | |
| | | * @param args 列表 |
| | | * @return 任务task |
| | | */ |
| | | public static TimerTask recordLogininfor(final String username, final String status, final String message, |
| | | public static TimerTask recordLogininfor(final String username, final String status, final String message,final String hospId, |
| | | final Object... args) { |
| | | final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); |
| | | final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); |
| | | |
| | | // log.info("院区参数hospId"+hospId); |
| | | return new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | |
| | | log.info("院区参数hospId"+hospId); |
| | | DataSourceContextHolder.setDataSourceKey(hospId); |
| | | SpringUtils.getBean(DataSourceConfig.class).addDataSource(hospId); |
| | | |
| | | String address = AddressUtils.getRealAddressByIP(ip); |
| | | StringBuilder s = new StringBuilder(); |
| | | s.append(LogUtils.getBlock(ip)); |
| | |
| | | }; |
| | | } |
| | | |
| | | |
| | | public static void recordLogininfornew(final String username, final String status, final String message, |
| | | final Object... args) { |
| | | final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); |
| | | final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); |
| | | String address = AddressUtils.getRealAddressByIP(ip); |
| | | StringBuilder s = new StringBuilder(); |
| | | s.append(LogUtils.getBlock(ip)); |
| | | s.append(address); |
| | | s.append(LogUtils.getBlock(username)); |
| | | s.append(LogUtils.getBlock(status)); |
| | | s.append(LogUtils.getBlock(message)); |
| | | // 打印信息到日志 |
| | | sys_user_logger.info(s.toString(), args); |
| | | // 获取客户端操作系统 |
| | | String os = userAgent.getOperatingSystem().getName(); |
| | | // 获取客户端浏览器 |
| | | String browser = userAgent.getBrowser().getName(); |
| | | // 封装对象 |
| | | SysLogininfor logininfor = new SysLogininfor(); |
| | | logininfor.setUserName(username); |
| | | logininfor.setIpaddr(ip); |
| | | logininfor.setLoginLocation(address); |
| | | logininfor.setBrowser(browser); |
| | | logininfor.setOs(os); |
| | | logininfor.setMsg(message); |
| | | // 日志状态 |
| | | if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { |
| | | logininfor.setStatus(Constants.SUCCESS); |
| | | } else if (Constants.LOGIN_FAIL.equals(status)) { |
| | | logininfor.setStatus(Constants.FAIL); |
| | | } |
| | | // 插入数据 |
| | | SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); |
| | | } |
| | | /** |
| | | * 操作日志记录 |
| | | * |
| | | * @param operLog 操作日志信息 |
| | | * @return 任务task |
| | | */ |
| | | public static TimerTask recordOper(final SysOperLog operLog) { |
| | | return new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | // 远程查询操作地点 |
| | | operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); |
| | | SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); |
| | | } |
| | | }; |
| | | // public static TimerTask recordOper(final SysOperLog operLog) { |
| | | // return new TimerTask() { |
| | | // @Override |
| | | // public void run() { |
| | | // // 远程查询操作地点 |
| | | // operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); |
| | | // SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); |
| | | // } |
| | | // }; |
| | | // } |
| | | |
| | | public static void recordOper(final SysOperLog operLog) { |
| | | // 远程查询操作地点 |
| | | operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); |
| | | SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); |
| | | } |
| | | } |
| | |
| | | package com.ltkj.framework.security.handle; |
| | | |
| | | import java.io.IOException; |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.ServletException; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.ltkj.db.DataSourceContextHolder; |
| | | import com.ltkj.framework.web.service.TokenService; |
| | | import com.ltkj.hosp.domain.DictHosp; |
| | | import com.ltkj.hosp.service.IDictHospService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.security.core.Authentication; |
| | |
| | | public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { |
| | | @Autowired |
| | | private TokenService tokenService; |
| | | |
| | | @Resource |
| | | private IDictHospService hospService; |
| | | /** |
| | | * 退出处理 |
| | | * |
| | |
| | | @Override |
| | | public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) |
| | | throws IOException, ServletException { |
| | | String hospId = request.getHeader("hospId"); |
| | | LambdaQueryWrapper<DictHosp> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.eq(DictHosp::getCode,hospId); |
| | | DictHosp hosp = hospService.getOne(wrapper); |
| | | DataSourceContextHolder.setDataSourceKey(hosp.getDbname()); |
| | | |
| | | LoginUser loginUser = tokenService.getLoginUser(request); |
| | | if (StringUtils.isNotNull(loginUser)) { |
| | | String userName = loginUser.getUsername(); |
| | | // 删除用户缓存记录 |
| | | tokenService.delLoginUser(loginUser.getToken(), loginUser.getUser().getUserId()); |
| | | // 记录用户退出日志 |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功",hosp.getDbname())); |
| | | // AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"); |
| | | } |
| | | ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功"))); |
| | | } |
| | |
| | | redisCache.deleteObject(verifyKey); |
| | | if (captcha == null) |
| | | { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"),hosp.getDbname())); |
| | | // AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); |
| | | throw new CaptchaExpireException(); |
| | | } |
| | | if (!code.equalsIgnoreCase(captcha)) |
| | | { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"),hosp.getDbname())); |
| | | // AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); |
| | | throw new CaptchaException(); |
| | | } |
| | | } |
| | |
| | | authentication = authenticationManager.authenticate(authenticationToken); |
| | | } catch (Exception e) { |
| | | if (e instanceof BadCredentialsException) { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"),hosp.getDbname())); |
| | | // AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")); |
| | | throw new UserPasswordNotMatchException(); |
| | | } else { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(),hosp.getDbname())); |
| | | // AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()); |
| | | throw new ServiceException(e.getMessage()); |
| | | } |
| | | } finally { |
| | | AuthenticationContextHolder.clearContext(); |
| | | } |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); |
| | | // AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); |
| | | // AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"),hosp.getDbname()); |
| | | // AsyncFactory.recordLogininforord(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"),hosp.getDbname()); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"),hosp.getDbname())); |
| | | LoginUser loginUser = (LoginUser) authentication.getPrincipal(); |
| | | loginUser.setHospDB(hosp.getDbname()); |
| | | loginUser.setHospId(hospId); |
| | |
| | | * @param password 密码 |
| | | * @return 结果 |
| | | */ |
| | | public String Cuslogin(String username,String sfzh, String password, Boolean type,String code,String uuid) { |
| | | public String Cuslogin(String username,String sfzh, String password, Boolean type,String code,String uuid, String hospId) { |
| | | |
| | | DataSourceContextHolder.setDataSourceKey(DataSourceType.MASTER.name()); |
| | | LambdaQueryWrapper<DictHosp> wrapper = new LambdaQueryWrapper<>(); |
| | | wrapper.eq(DictHosp::getCode,hospId); |
| | | DictHosp hosp = hospService.getOne(wrapper); |
| | | |
| | | DataSourceContextHolder.setDataSourceKey(hosp.getDbname()); |
| | | |
| | | String aSwitch = configService.selectConfigByKey("captcha_switch"); |
| | | if(null !=aSwitch && aSwitch.equalsIgnoreCase("Y")){ |
| | |
| | | redisCache.deleteObject(verifyKey); |
| | | if (captcha == null) |
| | | { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"),hosp.getDbname())); |
| | | // AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); |
| | | throw new CaptchaExpireException(); |
| | | } |
| | | if (!code.equalsIgnoreCase(captcha)) |
| | | { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); |
| | | AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"),hosp.getDbname()); |
| | | throw new CaptchaException(); |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, |
| | | MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime))); |
| | | // AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, |
| | | // MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime),null)); |
| | | AsyncFactory.recordLogininfornew(username, Constants.LOGIN_FAIL, |
| | | MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime)); |
| | | throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); |
| | | } |
| | | |
| | | if (!matches(user, password)) { |
| | | retryCount = retryCount + 1; |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, |
| | | MessageUtils.message("user.password.retry.limit.count", retryCount))); |
| | | // AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, |
| | | // MessageUtils.message("user.password.retry.limit.count", retryCount),null)); |
| | | AsyncFactory.recordLogininfornew(username, Constants.LOGIN_FAIL, |
| | | MessageUtils.message("user.password.retry.limit.count", retryCount)); |
| | | redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); |
| | | throw new UserPasswordNotMatchException(); |
| | | } else { |
| | |
| | | if (!regFlag) { |
| | | msg = "注册失败,请联系系统管理人员"; |
| | | } else { |
| | | AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); |
| | | AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"), null); |
| | | } |
| | | } |
| | | return msg; |
| | |
| | | } |
| | | |
| | | private String getTokenKey(String uuid) { |
| | | return CacheConstants.LOGIN_TOKEN_KEY + uuid; |
| | | |
| | | return CacheConstants.LOGIN_TOKEN_KEY+uuid; |
| | | } |
| | | |
| | | |