wangyingyang

add login

......@@ -6,7 +6,9 @@ import com.infoloop.tianting.intercepter.ApiSignInterceptor;
import com.infoloop.tianting.intercepter.LoginInterceptor;
import com.infoloop.tianting.intercepter.RequestMonitor;
import com.infoloop.tianting.intercepter.ResourceInjector;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.tracing.HttpTracingInterceptor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
......@@ -30,12 +32,13 @@ public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
public WebMvcConfig(final Tracing tracing,
final ResourceInjector resourceInjector) {
final ResourceInjector resourceInjector,
final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient) {
this.httpInterceptors = new ArrayList<>();
this.httpInterceptors.add(new HttpTracingInterceptor(tracing));
this.httpInterceptors.add(new RequestMonitor());
this.httpInterceptors.add(new ApiSignInterceptor());
this.httpInterceptors.add(new LoginInterceptor());
this.httpInterceptors.add(new LoginInterceptor(clientCustomerServiceRpcClient));
this.httpInterceptors.add(resourceInjector);
}
......@@ -75,6 +78,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
final var registrationBean = new FilterRegistrationBean<HttpServletRequestWrapperFilter>();
registrationBean.setFilter(new HttpServletRequestWrapperFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.addUrlPatterns();
return registrationBean;
}
}
......
......@@ -54,5 +54,6 @@ public interface CommonConstants {
String ENTERPRISE_ID = "enterpriseId";
String LOGIN_SOURCE = "loginSource";
}
......
package com.infoloop.tianting.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.SaTokenInfo;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.infoloop.tianting.model.dto.ClientCustomerDbDTO.ClientCustomerDto;
import com.infoloop.tianting.model.dto.ClientCustomerDbDTO.HospitalRecordDto;
import com.infoloop.tianting.model.dto.PermissionDTO.LoginDto;
import com.infoloop.tianting.model.dto.WxUserDto.WxUserOpenIdDto;
import com.infoloop.tianting.model.dto.WxUserDto.WxUserPhoneResponseDto;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.LoginService;
import com.infoloop.tianting.service.WxMiniProgramService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -17,6 +22,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
......@@ -29,6 +36,7 @@ import org.springframework.web.bind.annotation.RestController;
public class ClientCustomerController {
private final ClientCustomerService clientCustomerService;
private final WxMiniProgramService wxMiniProgramService;
private final LoginService loginService;
@ApiOperation(value = "根据hisCustomerId获取ClientCustomer")
@GetMapping("/customers/his/{hisCustomerId}")
......@@ -67,4 +75,12 @@ public class ClientCustomerController {
return wxMiniProgramService.getUserPhoneInfoByCode(code);
}
@SaIgnore
@ApiOperation(value = "登陆")
@PostMapping("/login")
@ResponseStatus(HttpStatus.OK)
public SaTokenInfo login(@Valid@RequestBody LoginDto loginDto) {
return loginService.login(loginDto);
}
}
......
package com.infoloop.tianting.enums;
import com.infoloop.tianting.exception.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum LoginSourceEnum{
CUSTOMER(1, "小程序住院客户"),
MINI_PROGRAM(2, "小程序非住院客户"),
CLIENT(3, "院区端"),
KDS(4, "KDS"),
;
/**
* 订单类型的值
*/
private final Integer value;
/**
* 订单类型的名字
*/
private final String name;
}
......@@ -3,13 +3,21 @@ package com.infoloop.tianting.intercepter;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.hutool.core.convert.Convert;
import com.infoloop.tianting.constant.CommonConstants;
import com.infoloop.tianting.context.LoginContextHolder;
import com.infoloop.tianting.enums.LoginSourceEnum;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.model.common.ResponseResult;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.utils.ResponseUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.jni.Error;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
......@@ -24,6 +32,8 @@ import java.io.IOException;
@SuppressWarnings("all")
@RequiredArgsConstructor
public class LoginInterceptor extends HandlerInterceptorAdapter {
// private final ClientCustomerService clientCustomerService;
private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
......@@ -52,13 +62,20 @@ public class LoginInterceptor extends HandlerInterceptorAdapter {
private boolean handleLogin(HttpServletRequest request, HttpServletResponse response, LoginContextHolder.LoginInfo.LoginInfoBuilder builder) throws SaTokenException {
// StpUtil.checkLogin();
// final var loginId = StpUtil.getLoginIdAsInt();
// final var enterpriseId = Convert.toInt(StpUtil.getExtra(CommonConstants.ENTERPRISE_ID));
//TODO: 校验登录,获取登录用户信息,注入登录用户上下文信息
builder.id(1)
.enterpriseId(1)
.name("admin");
StpUtil.checkLogin();
final var loginId = StpUtil.getLoginIdAsInt();
final var enterpriseId = Convert.toInt(StpUtil.getExtra(CommonConstants.ENTERPRISE_ID));
final var loginSource = Convert.toInt(StpUtil.getExtra(CommonConstants.LOGIN_SOURCE));
// if (loginSource.equals(LoginSourceEnum.CUSTOMER.getValue())) {
final var customer = clientCustomerServiceRpcClient.getClientCustomerById(loginId);
if (customer == null) {
response.setStatus(HttpStatus.FORBIDDEN.value());
ResponseUtil.write(response, ResponseResult.failed(ErrorCodeEnum.VALIDATE_FAILED));
return false;
}
builder.id(loginId)
.enterpriseId(enterpriseId)
.name(customer.getResponse().getName());
return true;
}
......
package com.infoloop.tianting.model.dto;
import com.infoloop.tianting.enums.LoginSourceEnum;
import io.swagger.annotations.ApiModel;
import lombok.Builder;
import lombok.Data;
@Data
@ApiModel(description = "权限相关DTO")
public class PermissionDTO {
@Data
@Builder
@ApiModel(description = "Login DTO")
public static class LoginDto {
private LoginSourceEnum loginSourceEnum;
private String hisCustomerId;
}
}
package com.infoloop.tianting.service;
import cn.dev33.satoken.stp.SaTokenInfo;
import com.infoloop.tianting.model.dto.PermissionDTO.LoginDto;
public interface LoginService {
SaTokenInfo login(LoginDto loginDto);
}
......@@ -9,6 +9,8 @@ import com.infoloop.tianting.clientcustomerservice.DeleteClientCustomerLabelRefs
import com.infoloop.tianting.clientcustomerservice.DeleteClientCustomerLabelRefsRpcResponse;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByHISCustomerIdRpcRequest;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByHISCustomerIdRpcResponse;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByIdRpcRequest;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByIdRpcResponse;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByMobileRpcRequest;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByMobileRpcResponse;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerHospitalRecordsByCustomerIdRpcRequest;
......@@ -40,6 +42,11 @@ public class ClientCustomerServiceRpcClient {
return clientCustomerServiceRpcBlockingStub.getClientCustomerByHISCustomerId(request);
}
public GetClientCustomerByIdRpcResponse getClientCustomerById(Integer id) {
final var request = GetClientCustomerByIdRpcRequest.newBuilder().setId(id).build();
return clientCustomerServiceRpcBlockingStub.getClientCustomerById(request);
}
public GetClientCustomerByMobileRpcResponse getClientCustomerByMobile(String phone) {
final var request = GetClientCustomerByMobileRpcRequest.newBuilder()
.setMobile(phone)
......
package com.infoloop.tianting.service.impl;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.infoloop.tianting.constant.CommonConstants;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.model.dto.PermissionDTO.LoginDto;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.LoginService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class LoginServiceImpl implements LoginService {
private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
@Override
public SaTokenInfo login(LoginDto loginDto) {
final var customer = clientCustomerServiceRpcClient.getClientCustomerByHISCustomerId(loginDto.getHisCustomerId());
if (customer.getResponse().getId() == 0) {
throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
}
StpUtil.login(customer.getResponse().getId(), SaLoginModel.create()
.setExtra(CommonConstants.ENTERPRISE_ID, customer.getResponse().getEnterpriseId())
.setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
.build());
return StpUtil.getTokenInfo();
}
}