diff --git a/epmet-auth/src/main/java/com/epmet/controller/LoginController.java b/epmet-auth/src/main/java/com/epmet/controller/LoginController.java index 0dad959f9c..d7b2bc6dc8 100644 --- a/epmet-auth/src/main/java/com/epmet/controller/LoginController.java +++ b/epmet-auth/src/main/java/com/epmet/controller/LoginController.java @@ -3,6 +3,7 @@ package com.epmet.controller; import com.epmet.common.token.dto.form.LoginByPassWordFormDTO; import com.epmet.common.token.dto.form.LoginByWxCodeFormDTO; import com.epmet.common.token.dto.result.UserTokenResultDTO; +import com.epmet.commons.tools.constant.Constant; import com.epmet.commons.tools.exception.ErrorCode; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.AssertUtils; @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.*; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; @@ -81,4 +83,18 @@ public class LoginController { Result result = loginService.loginByPassword(formDTO); return result; } + + /** + * @param request + * @return com.epmet.commons.tools.utils.Result + * @Author yinzuomei + * @Description 退出登录 + * @Date 2020/3/18 22:43 + **/ + @PostMapping(value = "logout") + public Result logout(HttpServletRequest request) { + String token = request.getParameter(Constant.TOKEN_HEADER); + return loginService.logoutByToken(token); + } + } diff --git a/epmet-auth/src/main/java/com/epmet/jwt/JwtTokenUtils.java b/epmet-auth/src/main/java/com/epmet/jwt/JwtTokenUtils.java index 25e6308add..33baf31c52 100644 --- a/epmet-auth/src/main/java/com/epmet/jwt/JwtTokenUtils.java +++ b/epmet-auth/src/main/java/com/epmet/jwt/JwtTokenUtils.java @@ -61,6 +61,33 @@ public class JwtTokenUtils { return null; } } + + /** + * @return java.util.Date + * @param token + * @Author yinzuomei + * @Description 获取token的有效期截止时间 + * @Date 2020/3/18 22:17 + **/ + public Date getExpiration(String token){ + try { + return Jwts.parser() + .setSigningKey(jwtProperties.getSecret()) + .parseClaimsJws(token) + .getBody().getExpiration(); + } catch (Exception e) { + logger.debug("validate is token error, token = " + token, e); + return null; + } + } + + /** + * @param map + * @return java.lang.String + * @Author yinzuomei + * @Description 根据app+client+userId生成token + * @Date 2020/3/18 22:29 + **/ public String createToken(Map map) { return Jwts.builder() .setHeaderParam("typ", "JWT") diff --git a/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java b/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java index 2eea36e2a5..a37f43b604 100644 --- a/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java +++ b/epmet-auth/src/main/java/com/epmet/redis/CaptchaRedis.java @@ -40,7 +40,7 @@ public class CaptchaRedis { public String get(String uuid){ String key = RedisKeys.getLoginCaptchaKey(uuid); String captcha = (String)redisUtils.get(key); - logger.info("获取验证码key=["+key+"]captcha=["+captcha+"]"); + //logger.info("获取验证码key=["+key+"]captcha=["+captcha+"]"); //删除验证码 if(captcha != null){ redisUtils.delete(key); diff --git a/epmet-auth/src/main/java/com/epmet/service/LoginService.java b/epmet-auth/src/main/java/com/epmet/service/LoginService.java index 8ecb3bb35d..444b2c5bbe 100644 --- a/epmet-auth/src/main/java/com/epmet/service/LoginService.java +++ b/epmet-auth/src/main/java/com/epmet/service/LoginService.java @@ -28,4 +28,13 @@ public interface LoginService { * @Date 2020/3/14 19:54 **/ Result loginByPassword(LoginByPassWordFormDTO formDTO); + + /** + * @param token + * @return com.epmet.commons.tools.utils.Result + * @Author yinzuomei + * @Description 退出登录 + * @Date 2020/3/18 22:44 + **/ + Result logoutByToken(String token); } diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java index 672fe52c68..835c9aab3a 100644 --- a/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java +++ b/epmet-auth/src/main/java/com/epmet/service/impl/CaptchaServiceImpl.java @@ -36,7 +36,7 @@ public class CaptchaServiceImpl implements CaptchaService { public BufferedImage create(String uuid) { //生成验证码 String captcha = producer.createText(); - logger.info("uuid:"+uuid+",生成的验证码:"+captcha); + //logger.info("uuid:"+uuid+",生成的验证码:"+captcha); //保存验证码 captchaRedis.set(uuid, captcha); diff --git a/epmet-auth/src/main/java/com/epmet/service/impl/LoginServiceImpl.java b/epmet-auth/src/main/java/com/epmet/service/impl/LoginServiceImpl.java index 75300f5d8e..bad9865c86 100644 --- a/epmet-auth/src/main/java/com/epmet/service/impl/LoginServiceImpl.java +++ b/epmet-auth/src/main/java/com/epmet/service/impl/LoginServiceImpl.java @@ -192,7 +192,7 @@ public class LoginServiceImpl implements LoginService { map.put("client", formDTO.getClient()); map.put("userId", userId); String token = jwtTokenUtils.createToken(map); - logger.info("app:"+formDTO.getApp()+"client:"+formDTO.getClient()+"userId:"+userId+"生成token["+token+"]"); +// logger.info("app:"+formDTO.getApp()+";client:"+formDTO.getClient()+";userId:"+userId+";生成token["+token+"]"); int expire = jwtTokenProperties.getExpire(); TokenDto tokenDto = new TokenDto(); tokenDto.setApp(formDTO.getApp()); @@ -201,7 +201,12 @@ public class LoginServiceImpl implements LoginService { tokenDto.setOpenId(wxMaJscode2SessionResult.getOpenid()); tokenDto.setSessionKey(wxMaJscode2SessionResult.getSessionKey()); tokenDto.setUnionId(wxMaJscode2SessionResult.getUnionid()); - cpUserDetailRedis.set(token,tokenDto, expire); + tokenDto.setToken(token); + tokenDto.setUpdateTime(System.currentTimeMillis()); + tokenDto.setExpireTime(jwtTokenUtils.getExpiration(token).getTime()); + cpUserDetailRedis.set(tokenDto, expire); +// logger.info("token过期时间:"+tokenUtil.getExpire(tokenDto.getApp(),tokenDto.getClient(),tokenDto.getUserId())); +// logger.info("截止时间:"+ DateUtils.format(jwtTokenUtils.getExpiration(token),"yyyy-MM-dd HH:mm:ss")); return token; } @@ -258,13 +263,27 @@ public class LoginServiceImpl implements LoginService { map.put("client", formDTO.getClient()); map.put("userId", userId); String token = jwtTokenUtils.createToken(map); - logger.info("app:"+formDTO.getApp()+"client:"+formDTO.getClient()+"userId:"+userId+"生成token["+token+"]"); +// logger.info("app:"+formDTO.getApp()+";client:"+formDTO.getClient()+";userId:"+userId+";生成token["+token+"]"); int expire = jwtTokenProperties.getExpire(); TokenDto tokenDto = new TokenDto(); tokenDto.setApp(formDTO.getApp()); tokenDto.setClient(formDTO.getClient()); tokenDto.setUserId(userId); - cpUserDetailRedis.set(token,tokenDto, expire); + tokenDto.setToken(token); + tokenDto.setUpdateTime(System.currentTimeMillis()); + tokenDto.setExpireTime(jwtTokenUtils.getExpiration(token).getTime()); + cpUserDetailRedis.set(tokenDto, expire); +// logger.info("token过期时间:"+tokenUtil.getExpire(tokenDto.getApp(),tokenDto.getClient(),tokenDto.getUserId())); +// logger.info("截止时间:"+ DateUtils.format(jwtTokenUtils.getExpiration(token),"yyyy-MM-dd HH:mm:ss")); return token; } + + + @Override + public Result logoutByToken(String token) { + //记录登出日志 + //删除redis + //web端清空菜单栏和权限,小程序目前又 + return null; + } } diff --git a/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/dto/TokenDto.java b/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/dto/TokenDto.java index 885c4831ed..a248297b04 100644 --- a/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/dto/TokenDto.java +++ b/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/dto/TokenDto.java @@ -1,9 +1,7 @@ package com.epmet.common.token.dto; -import com.google.gson.annotations.SerializedName; import lombok.Data; -import javax.validation.constraints.NotBlank; import java.io.Serializable; /** @@ -14,9 +12,7 @@ import java.io.Serializable; */ @Data public class TokenDto implements Serializable { - - private static final long serialVersionUID = 1L; - + private static final long serialVersionUID = 8883581762088390769L; /** * 政府端:gov、居民端:resi、运营端:oper */ @@ -46,4 +42,19 @@ public class TokenDto implements Serializable { * unionId */ private String unionId; + + /** + * token字符串 + */ + private String token; + + /** + * 过期时间戳 + */ + private Long expireTime; + + /** + * 最后一次更新时间 + */ + private long updateTime; } diff --git a/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/CpUserDetailRedis.java b/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/CpUserDetailRedis.java index c3eb2ccc9b..aa1f981180 100644 --- a/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/CpUserDetailRedis.java +++ b/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/CpUserDetailRedis.java @@ -30,11 +30,11 @@ public class CpUserDetailRedis { @Autowired private RedisUtils redisUtils; - public void set(String tokenStr,TokenDto user, long expire) { + public void set(TokenDto user, long expire) { if (user == null) { return; } - String key = RedisKeys.getCpUserKey(tokenStr); + String key = RedisKeys.getCpUserKey(user.getApp(), user.getClient(), user.getUserId()); //bean to map Map map = BeanUtil.beanToMap(user, false, true); redisUtils.hMSet(key, map, expire); @@ -43,11 +43,13 @@ public class CpUserDetailRedis { /** * 获取token信息 * - * @param tokenStr token字符串 + * @param app 居民端resi;政府端gov;运营端oper + * @param client PC端:web;微信小程序端:wxmp + * @param userId oper_user、customer_user、customer_staff表主键 * @return */ - public TokenDto get(String tokenStr) { - String key = RedisKeys.getCpUserKey(tokenStr); + public TokenDto get(String app, String client, String userId) { + String key = RedisKeys.getCpUserKey(app,client,userId); Map map = redisUtils.hGetAll(key); if (MapUtil.isEmpty(map)) { @@ -63,32 +65,38 @@ public class CpUserDetailRedis { /** * 删除用户信息 * - * @param tokenStr token字符串 + * @param app 居民端resi;政府端gov;运营端oper + * @param client PC端:web;微信小程序端:wxmp + * @param userId oper_user、customer_user、customer_staff表主键 */ - public void logout(String tokenStr) { - redisUtils.delete(RedisKeys.getCpUserKey(tokenStr)); + public void logout(String app, String client, String userId) { + redisUtils.delete(RedisKeys.getCpUserKey(app,client,userId)); } /** * 设置redis时间 * - * @param tokenStr - * @param expire + * @param app 居民端resi;政府端gov;运营端oper + * @param client PC端:web;微信小程序端:wxmp + * @param userId oper_user、customer_user、customer_staff表主键 + * @param expire 有效时间 * @author rongchao */ - public boolean expire(String tokenStr, long expire) { - return redisUtils.expire(RedisKeys.getCpUserKey(tokenStr), expire); + public boolean expire(String app, String client, String userId, long expire) { + return redisUtils.expire(RedisKeys.getCpUserKey(app,client,userId), expire); } /** * 查询token剩余时间 * - * @param tokenStr - * @return long + * @param app 居民端resi;政府端gov;运营端oper + * @param client PC端:web;微信小程序端:wxmp + * @param userId oper_user、customer_user、customer_staff表主键 + * @return 获取有效期 * @author yujintao * @date 2019/9/9 14:18 */ - public long getExpire(String tokenStr) { - return redisUtils.getExpire(RedisKeys.getCpUserKey(tokenStr)); + public long getExpire(String app, String client, String userId) { + return redisUtils.getExpire(RedisKeys.getCpUserKey(app, client, userId)); } } diff --git a/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/TokenUtil.java b/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/TokenUtil.java index f8b240b42c..f4cf11b08f 100644 --- a/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/TokenUtil.java +++ b/epmet-commons/epmet-common-clienttoken/src/main/java/com/epmet/common/token/util/TokenUtil.java @@ -24,28 +24,30 @@ public class TokenUtil { @Autowired private CpUserDetailRedis redisUtils; - public TokenDto getTokenInfo(String tokenStr) { - TokenDto tokenDto = redisUtils.get(tokenStr); + public TokenDto getTokenInfo(String app,String client,String userId) { + TokenDto tokenDto = redisUtils.get(app,client,userId); return tokenDto; } - public void expireToken(String tokenStr) { - redisUtils.logout(tokenStr); + public void expireToken(String app,String client,String userId) { + redisUtils.logout(app,client,userId); } - public boolean delayToken(String tokenStr) { - return redisUtils.expire(tokenStr, tokenPropertise.getExpire()); + public boolean delayToken(String app,String client,String userId) { + return redisUtils.expire(app, client,userId,tokenPropertise.getExpire()); } /** * 获取token过期时间 * - * @param tokenStr + * @param app + * @param client + * @param userId * @return long * @author yujintao * @date 2019/9/9 14:19 */ - public long getExpire(String tokenStr) { - return redisUtils.getExpire(tokenStr); + public long getExpire(String app,String client,String userId) { + return redisUtils.getExpire(app,client,userId); } } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 3627a06e61..1d8e7df2e3 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -76,11 +76,11 @@ public class RedisKeys { } /** - * 用户token Key + * epmet用户token对应redis中的Key * epmet:sys:security:user:token字符串 */ - public static String getCpUserKey(String tokenStr) { - return rootPrefix.concat("sys:security:user:").concat(tokenStr); + public static String getCpUserKey(String app, String client, String userId) { + return rootPrefix.concat("sys:security:user:").concat(app).concat(":").concat(client).concat(":").concat(userId); } /**