Browse Source

Merge remote-tracking branch 'origin/v1.0' into v1.0

contract
15989082884@163.com 2 years ago
parent
commit
ca110fa24d
  1. 9
      src/main/java/com/qs/serve/common/config/SpringMvcConfig.java
  2. 65
      src/main/java/com/qs/serve/common/framework/interceptor/ApiAuthInterceptor.java
  3. 13
      src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java
  4. 15
      src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java
  5. 10
      src/main/java/com/qs/serve/common/util/AuthContextUtils.java
  6. 52
      src/main/java/com/qs/serve/controller/WxSvcLoginApi.java
  7. 20
      src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLoginServiceImpl.java
  8. 2
      src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java
  9. 5
      src/main/java/com/qs/serve/modules/wx/controller/WxUserController.java
  10. 7
      src/main/java/com/qs/serve/modules/wx/service/WxUserService.java
  11. 63
      src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java

9
src/main/java/com/qs/serve/common/config/SpringMvcConfig.java

@ -1,6 +1,5 @@
package com.qs.serve.common.config;
import com.qs.serve.common.framework.interceptor.ApiAuthInterceptor;
import com.qs.serve.common.framework.interceptor.LimitSubmitInterceptor;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
@ -22,14 +21,14 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class SpringMvcConfig implements WebMvcConfigurer {
private final LimitSubmitInterceptor limitSubmitInterceptor;
private final ApiAuthInterceptor apiAuthInterceptor;
//private final ApiAuthInterceptor apiAuthInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册LimitSubmitInterceptor拦截器
registry.addInterceptor(apiAuthInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/wx/login/*","/api/dev/**");
// registry.addInterceptor(apiAuthInterceptor)
// .addPathPatterns("/api/**")
// .excludePathPatterns("/api/wx/login/*","/api/dev/**");
registry.addInterceptor(limitSubmitInterceptor)
.addPathPatterns("/**");
}

65
src/main/java/com/qs/serve/common/framework/interceptor/ApiAuthInterceptor.java

@ -1,65 +0,0 @@
package com.qs.serve.common.framework.interceptor;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.framework.security.model.LoginUserDTO;
import com.qs.serve.common.model.consts.GySysConst;
import com.qs.serve.common.model.consts.RedisCacheKeys;
import com.qs.serve.common.util.JsonUtil;
import com.qs.serve.common.util.StringUtils;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;
/**
* API接口身份拦截器
* @author YenHex
*/
@Configuration(proxyBeanMethods = false)
public class ApiAuthInterceptor implements HandlerInterceptor {
@Resource private RedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader(GySysConst.APP_TOKEN_PROP);
String loginUserJson = redisService.getString(RedisCacheKeys.LOGIN_KEY_WX+token);
if(loginUserJson!=null){
LoginUser loginUser = Objects.requireNonNull(JsonUtil.jsonToPojo(loginUserJson, LoginUserDTO.class)).loginUser();
String wxLoginKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_WXUSER,loginUser.getUserId());
String sysUserId = redisService.getString(wxLoginKey);
if(sysUserId!=null){
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
return true;
}
}
try {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "86400");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setStatus(200);
response.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
response.getWriter().print("{\"status\":401,\"msg\":\"用户信息无效或过期了\"}");
response.getWriter().flush();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}

13
src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java

@ -57,19 +57,6 @@ public class SecurityRequestFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
String appToken = request.getHeader(GySysConst.APP_TOKEN_PROP);
String loginUserJson = redisService.getString(RedisCacheKeys.LOGIN_KEY_WX+appToken);
if(loginUserJson!=null){
LoginUser loginUser = Objects.requireNonNull(JsonUtil.jsonToPojo(loginUserJson, LoginUserDTO.class)).loginUser();
String wxLoginKey = com.qs.serve.common.util.StringUtils.format(RedisCacheKeys.LOGIN_KEY_WXUSER,loginUser.getUserId());
String sysUserId = redisService.getString(wxLoginKey);
if(sysUserId==null){
HttpResponsePrintUtil.print2(response,401,"账号绑定更新,已被系统登出");
return;
}
}
String supplierId = request.getHeader(GySysConst.SUPPLIER_PROP);
AuthContextUtils.setSupplierId(supplierId);
//移除前缀

15
src/main/java/com/qs/serve/common/model/consts/RedisCacheKeys.java

@ -6,27 +6,18 @@ package com.qs.serve.common.model.consts;
*/
public class RedisCacheKeys {
/** 权限列表 */
public final static String PERMIT_ALL_LIST = "expire_permit_list";
/** 租户列表 */
public final static String Tenant_ALL_LIST = "expire_tenant_list";
/** 管理员登录key */
public final static String LOGIN_KEY_ADMIN = "login_admin_:";
/** 家长登录key */
public final static String LOGIN_KEY_WX = "login_wx_:";
public final static String LOGIN_KEY_WXUSER= "login_wx_usr:{}";
/** 用户登录APP {}客户端 {}用户ID */
public final static String LOGIN_KEY_APP = "login_app_{}:{}:";
/** 微信用户ID */
public final static String WX_KEY_USER = "wx_usr_id:{}:";
/** 手机号验证吗 */
public final static String PHONE_KEY = "phone_code_:";
/** 工号标识 */
public final static String SYS_USER_CODE_KEY = "sys_user_code_:";
}

10
src/main/java/com/qs/serve/common/util/AuthContextUtils.java

@ -65,11 +65,11 @@ public class AuthContextUtils {
*/
public static String getSysUserId(){
LoginUser loginUser = getLoginUser();
if(loginUser.getTypeFlag().equals(LoginUserType.SYS_SUP_USER)
||loginUser.getTypeFlag().equals(LoginUserType.SYS_USER)){
return loginUser.getUserId();
}
return null;
// if(loginUser.getTypeFlag().equals(LoginUserType.SYS_SUP_USER)
// ||loginUser.getTypeFlag().equals(LoginUserType.SYS_USER)){
// return loginUser.getUserId();
// }
return loginUser.getUserId();
}
/**

52
src/main/java/com/qs/serve/controller/WxSvcLoginApi.java

@ -66,31 +66,26 @@ public class WxSvcLoginApi {
Assert.throwEx(HttpCode.WX_ERR);
}
String token = IdUtil.fastSimpleUUID();
String key = RedisCacheKeys.LOGIN_KEY_WX + token;
LoginUser loginUser = new LoginUser(wxUser.getId(),wxUser.getEmpName(),"",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
redisService.set(key, JsonUtil.objectToJson(loginUser.loginUserDTO()),2, TimeUnit.DAYS);
objectMap.put("token",token);
String wxLoginKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_WXUSER,wxUser.getId());
redisService.set(wxLoginKey,wxUser.getSysUserId(),2, TimeUnit.DAYS);
//微信登录ID
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
redisService.set(wxUserKey,wxUser.getId());
//后台管理员信息
//if(StringUtils.hasText(wxUser.getSysUserId())){
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId());
String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client);
redisService.set(redisKey,pctoken);
tokenMap.put("token", pctoken);
tokenMap.put("userId", wxUser.getSysUserId());
tokenMap.put("IP", loginUser.getLoginIp());
tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant()));
tokenMap.put("loginType",client);
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
//}
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,wxUser.getSysUserId());
String pctoken = JwtUtils.generateToken(wxUser.getSysUserId(),loginUser.getTypeFlag(),client);
redisService.set(redisKey,pctoken);
tokenMap.put("token", pctoken);
tokenMap.put("userId", wxUser.getSysUserId());
tokenMap.put("IP", loginUser.getLoginIp());
tokenMap.put("tenant", sysTenantMapper.selectById(loginUser.getTenant()));
tokenMap.put("loginType",client);
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
return R.ok(objectMap);
}
@ -100,19 +95,15 @@ public class WxSvcLoginApi {
@PostMapping("/mptest")
public R<?> login(HttpServletRequest request){
Map<String,Object> objectMap = new HashMap<>();
String token = TokenUtil.desEncrypt(IdUtil.timeStampId());
String key = RedisCacheKeys.LOGIN_KEY_WX + token;
String token = IdUtil.fastSimpleUUID();
//微信登录ID
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
redisService.set(wxUserKey,"1");
LoginUser loginUser = new LoginUser("1","微信测试用户","",
ServletUtils.getIp(request), LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
redisService.set(key, JsonUtil.objectToJson(loginUser.loginUserDTO()),2, TimeUnit.DAYS);
objectMap.put("token",token);
String sysUserId = "1";
String wxLoginKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_WXUSER,sysUserId);
redisService.set(wxLoginKey,sysUserId,2, TimeUnit.DAYS);
Map<String,Object> tokenMap = new HashMap<>(10);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,sysUserId);
@ -126,7 +117,6 @@ public class WxSvcLoginApi {
tokenMap.put("client",client);
//关联
objectMap.put("adminTokenInfo",tokenMap);
return R.ok(objectMap);
}

20
src/main/java/com/qs/serve/modules/sys/service/impl/SysUserLoginServiceImpl.java

@ -109,25 +109,7 @@ public class SysUserLoginServiceImpl implements SysUserLoginService {
tokenMap.put("loginType",loginType);
tokenMap.put("client",client);
//拓展微信token
String wxtoken = IdUtil.fastSimpleUUID();
String key = RedisCacheKeys.LOGIN_KEY_WX + wxtoken;
LambdaQueryWrapper<WxUser> wxUsrLqw = new LambdaQueryWrapper<>();
wxUsrLqw.eq(WxUser::getSysUserId,loginUser.getUserId());
wxUsrLqw.eq(WxUser::getSysUserId,loginUser.getUserId());
WxUser wxUser = null;
try {
wxUser = wxUserMapper.selectOne(wxUsrLqw);
} catch (Exception e) {
e.printStackTrace();
}
if(wxUser!=null){
LoginUser wxloginUser = new LoginUser(wxUser.getId(),wxUser.getEmpName(),"",
"", LoginUserType.APP_USER,new ArrayList<>(),null,AuthContextUtils.getTenant());
redisService.set(key, JsonUtil.objectToJson(wxloginUser.loginUserDTO()),2, TimeUnit.DAYS);
tokenMap.put("wxToken",token);
}else {
tokenMap.put("wxToken","notBindWx");
}
tokenMap.put("wxToken","");
return tokenMap;
}

2
src/main/java/com/qs/serve/modules/wx/api/WxSvcUserApi.java

@ -43,7 +43,7 @@ public class WxSvcUserApi {
*/
@GetMapping("/info")
public R<?> info(){
WxUser wxUser = wxUserService.getCurrentWxUser(false,true);
WxUser wxUser = wxUserService.getCurrentWxUser(true);
return R.ok(wxUser);
}

5
src/main/java/com/qs/serve/modules/wx/controller/WxUserController.java

@ -140,8 +140,9 @@ public class WxUserController {
wxUserService.updateById(wxUser);
}
}
String wxLoginKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_WXUSER,wxUserId);
redisService.remove(wxLoginKey);
String client = "wx_app";
String redisKey = StringUtils.format(RedisCacheKeys.LOGIN_KEY_APP,client,sysUserId);
redisService.remove(redisKey);
return R.ok();
}

7
src/main/java/com/qs/serve/modules/wx/service/WxUserService.java

@ -14,19 +14,18 @@ import java.util.List;
public interface WxUserService extends IService<WxUser> {
WxUser getCurrentWxUser();
WxUser getCurrentWxUser(boolean filterZero);
/**
* 获取当前微信用户
* @param filterZero
* 获取当前微信用
* @param updateSub
* @return
*/
WxUser getCurrentWxUser(boolean filterZero,boolean updateSub);
WxUser getCurrentWxUser(boolean updateSub);
void syncSubscribe();
List<WxUser> getByUnionId(String unionId);
List<WxUser> getBySysUserId(String userId);
WxUser getByCurrSysUserId(String userId);
List<WxUser> getBySysUserIds(List<String> userIds);
/**

63
src/main/java/com/qs/serve/modules/wx/service/impl/WxUserServiceImpl.java

@ -2,12 +2,16 @@ package com.qs.serve.modules.wx.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qs.serve.common.framework.redis.RedisService;
import com.qs.serve.common.framework.security.model.LoginUser;
import com.qs.serve.common.framework.security.model.LoginUserType;
import com.qs.serve.common.model.consts.GySysConst;
import com.qs.serve.common.model.consts.RedisCacheKeys;
import com.qs.serve.common.model.dto.R;
import com.qs.serve.common.model.enums.HttpCode;
import com.qs.serve.common.util.*;
import com.qs.serve.modules.sys.entity.SysUser;
import com.qs.serve.modules.sys.mapper.SysUserMapper;
import com.qs.serve.modules.wx.common.conf.WxMpConfig;
import com.qs.serve.modules.wx.common.consts.WxStatusConst;
import com.qs.serve.modules.wx.entity.WxApp;
@ -47,6 +51,9 @@ public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> impleme
@Autowired(required = false)
private WxAppService wxAppService;
@Autowired
private RedisService redisService;
private List<String> getOpenIds(WxMpUserService wxMpUserService,String nextOpenId){
WxMpUserList wxMpUserList = null;
List<String> openIds = new ArrayList<>();
@ -90,41 +97,27 @@ public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> impleme
return this.getCurrentWxUser(false);
}
@Override
public WxUser getCurrentWxUser(boolean filterZero) {
return this.getCurrentWxUser(filterZero,false);
}
@Override
public WxUser getCurrentWxUser(boolean filterZero, boolean updateSub) {
LoginUser loginUser = AuthContextUtils.getLoginUser();
if(loginUser.getTypeFlag().equals(LoginUserType.APP_USER)){
WxUser wxUser = getById(loginUser.getUserId());
if(wxUser==null){
Assert.throwEx(HttpCode.LOGIN_ERR);
}
if(wxUser.getId().equals("1")){
return wxUser;
}
String appId = AuthContextUtils.getAppId();
if(updateSub){
try {
WxMpService wxMpService = wxMpConfig.wxMpService().switchoverTo(appId);
WxMpUser wxMpUser = wxMpService.getUserService().userInfo(wxUser.getOpenId(), GySysConst.LANG_ZH_CN);
wxUser.setSubscribe(wxMpUser.getSubscribe()?1:0);
wxUser.setSubscribeScene(wxMpUser.getSubscribeScene());
wxUser.setTagidList(JsonUtil.objectToJson(wxMpUser.getTagIds()));
wxUser.setUnionId(wxMpUser.getUnionId());
} catch (WxErrorException e) {
e.printStackTrace();
}
}
if(filterZero && (wxUser.getSysUserId()==null||wxUser.getSysUserId().equals("0"))){
return null;
public WxUser getCurrentWxUser( boolean updateSub) {
String token = ServletUtils.getHeader(GySysConst.APP_TOKEN_PROP);
String wxUserKey = StringUtils.format(RedisCacheKeys.WX_KEY_USER,token);
String wxUserId = redisService.getString(wxUserKey);
String appId = AuthContextUtils.getAppId();
WxUser wxUser = this.getById(wxUserId);
if(updateSub&&!wxUser.getId().equals("1")){
try {
WxMpService wxMpService = wxMpConfig.wxMpService().switchoverTo(appId);
WxMpUser wxMpUser = wxMpService.getUserService().userInfo(wxUser.getOpenId(), GySysConst.LANG_ZH_CN);
wxUser.setSubscribe(wxMpUser.getSubscribe()?1:0);
wxUser.setSubscribeScene(wxMpUser.getSubscribeScene());
wxUser.setTagidList(JsonUtil.objectToJson(wxMpUser.getTagIds()));
wxUser.setUnionId(wxMpUser.getUnionId());
} catch (WxErrorException e) {
e.printStackTrace();
}
return wxUser;
}
return null;
return wxUser;
}
@Override
@ -141,6 +134,14 @@ public class WxUserServiceImpl extends ServiceImpl<WxUserMapper, WxUser> impleme
return this.list(lqw);
}
@Override
public WxUser getByCurrSysUserId(String userId) {
LambdaQueryWrapper<WxUser> lqw = new LambdaQueryWrapper<>();
lqw.eq(WxUser::getSysUserId,userId);
lqw.eq(WxUser::getAppId,AuthContextUtils.getAppId(false));
return this.getOne(lqw,false);
}
@Override
public List<WxUser> getBySysUserIds(List<String> userIds) {
LambdaQueryWrapper<WxUser> lqw = new LambdaQueryWrapper<>();

Loading…
Cancel
Save