diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java index 9d469ae..8af18cc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -2,22 +2,31 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.dao.UserActionMapper; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.JJWTRootUtils; import com.casic.missiles.modular.system.utils.UuidUtils; import com.casic.missiles.modular.system.utils.WXUserUtils; import dm.jdbc.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; +import io.jsonwebtoken.Claims; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service("UserActionService") public class UserActionServiceImpl extends ServiceImpl implements UserActionService { @@ -25,14 +34,39 @@ @Resource private UserActionMapper userActionDao; - @Value("${casic.file.uploadPath}") - private String filePath; + @Resource + private RedisTemplate redisTemplate; + + final String SALT = "y76dniizew"; @Override - public Object userLogin(ParamsDto dto) { + public Object getLoginToken(String code) { + JSONObject jsonObject = WXUserUtils.getOpenId(code); + if(null == jsonObject.get("openid")){ + return ResponseData.error(jsonObject.get("errmsg").toString()); + } + String newOpenid = ShiroKit.md5(jsonObject.get("openid").toString(), SALT); + Map payLoad = new HashMap<>(); + payLoad.put("token", newOpenid); + String token = JJWTRootUtils.generatorToken(payLoad); + if(StringUtil.isNotEmpty(token)){ + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(newOpenid, jsonObject); + redisTemplate.expire(newOpenid, 300 , TimeUnit.SECONDS); + } + return ResponseData.success(token); + } + + @Override + public Object userLogin(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } UserDto userDto = new UserDto(); - String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + //String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + String phone = dto.getPhoneCode(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -40,16 +74,12 @@ UserDto user = userActionDao.getUserInfo(userDto); if(null != user){ if(StringUtil.isEmpty(user.getSyncId())){ - JSONObject jsonObject = WXUserUtils.getOpenId(dto.getCode()); - if(null != jsonObject.get("openid")){ - user.setSyncId(jsonObject.get("openid").toString()); - } + user.setSyncId(jsonObject.get("openid").toString()); List list = userActionDao.getList(user.getSalt()); user.setSalt(list.get(0).getName()); userActionDao.setUserOpenId(user); } - user.setAvatar(filePath+user.getAvatar()); - return ResponseData.success(user); + return ResponseData.success(); }else{ return ResponseData.error(Status.USER_ALREADY_NOT_REGISTERED); } @@ -63,7 +93,8 @@ public Object userRegister(UserDto userDto) { try { SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String phone = WXUserUtils.getPhone(userDto.getPhone()); + //String phone = WXUserUtils.getPhone(userDto.getPhone()); + String phone = userDto.getPhone(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -89,8 +120,12 @@ } @Override - public Object updateUserImg(ParamsDto dto) { + public Object updateUserImg(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } userActionDao.updateUserImg(dto.getFileId(), dto.getUid()); return ResponseData.success(); }catch (Exception e){ @@ -100,8 +135,12 @@ } @Override - public Object getUserJurisdiction(ParamsDto dto) { + public Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } List resList = userActionDao.getUserJurisdiction(dto.getUid()); return ResponseData.success(resList); }catch (Exception e){ @@ -111,6 +150,34 @@ } @Override + public Object getUserInfo(HttpServletRequest request) { + try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } + UserDto userDto = new UserDto(); + userDto.setSyncId(jsonObject.get("openid").toString()); + UserDto user = userActionDao.getUserInfo(userDto); + return ResponseData.success(user); + }catch (Exception e){ + e.printStackTrace(); + return ResponseData.error(Status.FAIL); + } + } + + public JSONObject getLoginStatus(HttpServletRequest request) { + try { + String token = request.getHeader("token"); + Claims claims = JJWTRootUtils.phaseTokenGetBody(token); + return (JSONObject) redisTemplate.opsForValue().get(claims.get("token")); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + @Override public Object getUserType() { try { List list = userActionDao.getList(""); diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java index 9d469ae..8af18cc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -2,22 +2,31 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.dao.UserActionMapper; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.JJWTRootUtils; import com.casic.missiles.modular.system.utils.UuidUtils; import com.casic.missiles.modular.system.utils.WXUserUtils; import dm.jdbc.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; +import io.jsonwebtoken.Claims; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service("UserActionService") public class UserActionServiceImpl extends ServiceImpl implements UserActionService { @@ -25,14 +34,39 @@ @Resource private UserActionMapper userActionDao; - @Value("${casic.file.uploadPath}") - private String filePath; + @Resource + private RedisTemplate redisTemplate; + + final String SALT = "y76dniizew"; @Override - public Object userLogin(ParamsDto dto) { + public Object getLoginToken(String code) { + JSONObject jsonObject = WXUserUtils.getOpenId(code); + if(null == jsonObject.get("openid")){ + return ResponseData.error(jsonObject.get("errmsg").toString()); + } + String newOpenid = ShiroKit.md5(jsonObject.get("openid").toString(), SALT); + Map payLoad = new HashMap<>(); + payLoad.put("token", newOpenid); + String token = JJWTRootUtils.generatorToken(payLoad); + if(StringUtil.isNotEmpty(token)){ + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(newOpenid, jsonObject); + redisTemplate.expire(newOpenid, 300 , TimeUnit.SECONDS); + } + return ResponseData.success(token); + } + + @Override + public Object userLogin(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } UserDto userDto = new UserDto(); - String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + //String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + String phone = dto.getPhoneCode(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -40,16 +74,12 @@ UserDto user = userActionDao.getUserInfo(userDto); if(null != user){ if(StringUtil.isEmpty(user.getSyncId())){ - JSONObject jsonObject = WXUserUtils.getOpenId(dto.getCode()); - if(null != jsonObject.get("openid")){ - user.setSyncId(jsonObject.get("openid").toString()); - } + user.setSyncId(jsonObject.get("openid").toString()); List list = userActionDao.getList(user.getSalt()); user.setSalt(list.get(0).getName()); userActionDao.setUserOpenId(user); } - user.setAvatar(filePath+user.getAvatar()); - return ResponseData.success(user); + return ResponseData.success(); }else{ return ResponseData.error(Status.USER_ALREADY_NOT_REGISTERED); } @@ -63,7 +93,8 @@ public Object userRegister(UserDto userDto) { try { SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String phone = WXUserUtils.getPhone(userDto.getPhone()); + //String phone = WXUserUtils.getPhone(userDto.getPhone()); + String phone = userDto.getPhone(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -89,8 +120,12 @@ } @Override - public Object updateUserImg(ParamsDto dto) { + public Object updateUserImg(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } userActionDao.updateUserImg(dto.getFileId(), dto.getUid()); return ResponseData.success(); }catch (Exception e){ @@ -100,8 +135,12 @@ } @Override - public Object getUserJurisdiction(ParamsDto dto) { + public Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } List resList = userActionDao.getUserJurisdiction(dto.getUid()); return ResponseData.success(resList); }catch (Exception e){ @@ -111,6 +150,34 @@ } @Override + public Object getUserInfo(HttpServletRequest request) { + try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } + UserDto userDto = new UserDto(); + userDto.setSyncId(jsonObject.get("openid").toString()); + UserDto user = userActionDao.getUserInfo(userDto); + return ResponseData.success(user); + }catch (Exception e){ + e.printStackTrace(); + return ResponseData.error(Status.FAIL); + } + } + + public JSONObject getLoginStatus(HttpServletRequest request) { + try { + String token = request.getHeader("token"); + Claims claims = JJWTRootUtils.phaseTokenGetBody(token); + return (JSONObject) redisTemplate.opsForValue().get(claims.get("token")); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + @Override public Object getUserType() { try { List list = userActionDao.getList(""); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java new file mode 100644 index 0000000..6fd6672 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java @@ -0,0 +1,113 @@ +package com.casic.missiles.modular.system.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.*; + +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + + +/** + * 生成jwt工具类 + */ +public class JJWTRootUtils { + + //定义对应的编码算法 + static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + //盐值 + static String secretKey = "asdfdsagfdgfdagdafgwetreg"; + + //获取key(指定算法和盐值的key对象) + private static Key generateKey(){ + //将盐值转成字节 + byte[] bytes = DatatypeConverter.parseBase64Binary(secretKey); + //根据算法和盐值生成对应的key值 + Key key = new SecretKeySpec(bytes, signatureAlgorithm.getJcaName()); + return key; + } + + /** + * 将我们的数据使用JWT的方式变成一个token xxx.yyy.zzz + * @param payLoad 负载(数据信息) + * @return + */ + public static String generatorToken(Map payLoad){ + ObjectMapper objectMapper = new ObjectMapper(); + try{ + //构建jwt生成器 + JwtBuilder builder = Jwts.builder(); + //将负载信息设置到jwt生成器中 + JwtBuilder jwtBuilder = builder.setPayload(objectMapper.writeValueAsString(payLoad)); + //根据签名算法和key值,生成新的jwtBuilder + JwtBuilder jwtBuilder1 = jwtBuilder.signWith(signatureAlgorithm, generateKey()); + String token = jwtBuilder1.compact(); + return token; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据指定的token, 返回对应的body信息 + * @param token + * @return + */ + public static Claims phaseTokenGetBody(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + Claims body = claimsJws.getBody();//主要存放的信息 + return body; + } + + /** + * 根据指定的token获取签名信息 + * @param token + * @return + */ + public static String phaseTokenGetSignature(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + String signature = claimsJws.getSignature(); + return signature; + } + + + /** + * 根据指定的token获取头信息 + * @param token + * @return + */ + public static JwsHeader phaseTokenGetHeader(String token){ + //获取解析器 + JwtParser parser = Jwts.parser(); + //设置签名key(盐值) + parser = parser.setSigningKey(generateKey()); + //解析token + Jws claimsJws = parser.parseClaimsJws(token); + JwsHeader header = claimsJws.getHeader(); + return header; + } + + + public static void main(String[] args) { + //随机获取盐值 +// System.out.println(UUID.randomUUID().toString().replaceAll("-", "")); + Map payLoad = new HashMap<>(); + payLoad.put("name", "curry"); + String s = generatorToken(payLoad); + //eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiY3VycnkifQ.Sf3GiF3p56nLzoAxEHLXcAckPmmPTtecj1_lGT9oV8s + System.out.println(s); + + //调用自定义API获取结果 + Claims claims = phaseTokenGetBody(s); + //{name=curry} + System.out.println(claims); + } + +} + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java index 9d469ae..8af18cc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -2,22 +2,31 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.dao.UserActionMapper; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.JJWTRootUtils; import com.casic.missiles.modular.system.utils.UuidUtils; import com.casic.missiles.modular.system.utils.WXUserUtils; import dm.jdbc.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; +import io.jsonwebtoken.Claims; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service("UserActionService") public class UserActionServiceImpl extends ServiceImpl implements UserActionService { @@ -25,14 +34,39 @@ @Resource private UserActionMapper userActionDao; - @Value("${casic.file.uploadPath}") - private String filePath; + @Resource + private RedisTemplate redisTemplate; + + final String SALT = "y76dniizew"; @Override - public Object userLogin(ParamsDto dto) { + public Object getLoginToken(String code) { + JSONObject jsonObject = WXUserUtils.getOpenId(code); + if(null == jsonObject.get("openid")){ + return ResponseData.error(jsonObject.get("errmsg").toString()); + } + String newOpenid = ShiroKit.md5(jsonObject.get("openid").toString(), SALT); + Map payLoad = new HashMap<>(); + payLoad.put("token", newOpenid); + String token = JJWTRootUtils.generatorToken(payLoad); + if(StringUtil.isNotEmpty(token)){ + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(newOpenid, jsonObject); + redisTemplate.expire(newOpenid, 300 , TimeUnit.SECONDS); + } + return ResponseData.success(token); + } + + @Override + public Object userLogin(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } UserDto userDto = new UserDto(); - String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + //String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + String phone = dto.getPhoneCode(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -40,16 +74,12 @@ UserDto user = userActionDao.getUserInfo(userDto); if(null != user){ if(StringUtil.isEmpty(user.getSyncId())){ - JSONObject jsonObject = WXUserUtils.getOpenId(dto.getCode()); - if(null != jsonObject.get("openid")){ - user.setSyncId(jsonObject.get("openid").toString()); - } + user.setSyncId(jsonObject.get("openid").toString()); List list = userActionDao.getList(user.getSalt()); user.setSalt(list.get(0).getName()); userActionDao.setUserOpenId(user); } - user.setAvatar(filePath+user.getAvatar()); - return ResponseData.success(user); + return ResponseData.success(); }else{ return ResponseData.error(Status.USER_ALREADY_NOT_REGISTERED); } @@ -63,7 +93,8 @@ public Object userRegister(UserDto userDto) { try { SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String phone = WXUserUtils.getPhone(userDto.getPhone()); + //String phone = WXUserUtils.getPhone(userDto.getPhone()); + String phone = userDto.getPhone(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -89,8 +120,12 @@ } @Override - public Object updateUserImg(ParamsDto dto) { + public Object updateUserImg(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } userActionDao.updateUserImg(dto.getFileId(), dto.getUid()); return ResponseData.success(); }catch (Exception e){ @@ -100,8 +135,12 @@ } @Override - public Object getUserJurisdiction(ParamsDto dto) { + public Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } List resList = userActionDao.getUserJurisdiction(dto.getUid()); return ResponseData.success(resList); }catch (Exception e){ @@ -111,6 +150,34 @@ } @Override + public Object getUserInfo(HttpServletRequest request) { + try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } + UserDto userDto = new UserDto(); + userDto.setSyncId(jsonObject.get("openid").toString()); + UserDto user = userActionDao.getUserInfo(userDto); + return ResponseData.success(user); + }catch (Exception e){ + e.printStackTrace(); + return ResponseData.error(Status.FAIL); + } + } + + public JSONObject getLoginStatus(HttpServletRequest request) { + try { + String token = request.getHeader("token"); + Claims claims = JJWTRootUtils.phaseTokenGetBody(token); + return (JSONObject) redisTemplate.opsForValue().get(claims.get("token")); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + @Override public Object getUserType() { try { List list = userActionDao.getList(""); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java new file mode 100644 index 0000000..6fd6672 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java @@ -0,0 +1,113 @@ +package com.casic.missiles.modular.system.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.*; + +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + + +/** + * 生成jwt工具类 + */ +public class JJWTRootUtils { + + //定义对应的编码算法 + static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + //盐值 + static String secretKey = "asdfdsagfdgfdagdafgwetreg"; + + //获取key(指定算法和盐值的key对象) + private static Key generateKey(){ + //将盐值转成字节 + byte[] bytes = DatatypeConverter.parseBase64Binary(secretKey); + //根据算法和盐值生成对应的key值 + Key key = new SecretKeySpec(bytes, signatureAlgorithm.getJcaName()); + return key; + } + + /** + * 将我们的数据使用JWT的方式变成一个token xxx.yyy.zzz + * @param payLoad 负载(数据信息) + * @return + */ + public static String generatorToken(Map payLoad){ + ObjectMapper objectMapper = new ObjectMapper(); + try{ + //构建jwt生成器 + JwtBuilder builder = Jwts.builder(); + //将负载信息设置到jwt生成器中 + JwtBuilder jwtBuilder = builder.setPayload(objectMapper.writeValueAsString(payLoad)); + //根据签名算法和key值,生成新的jwtBuilder + JwtBuilder jwtBuilder1 = jwtBuilder.signWith(signatureAlgorithm, generateKey()); + String token = jwtBuilder1.compact(); + return token; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据指定的token, 返回对应的body信息 + * @param token + * @return + */ + public static Claims phaseTokenGetBody(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + Claims body = claimsJws.getBody();//主要存放的信息 + return body; + } + + /** + * 根据指定的token获取签名信息 + * @param token + * @return + */ + public static String phaseTokenGetSignature(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + String signature = claimsJws.getSignature(); + return signature; + } + + + /** + * 根据指定的token获取头信息 + * @param token + * @return + */ + public static JwsHeader phaseTokenGetHeader(String token){ + //获取解析器 + JwtParser parser = Jwts.parser(); + //设置签名key(盐值) + parser = parser.setSigningKey(generateKey()); + //解析token + Jws claimsJws = parser.parseClaimsJws(token); + JwsHeader header = claimsJws.getHeader(); + return header; + } + + + public static void main(String[] args) { + //随机获取盐值 +// System.out.println(UUID.randomUUID().toString().replaceAll("-", "")); + Map payLoad = new HashMap<>(); + payLoad.put("name", "curry"); + String s = generatorToken(payLoad); + //eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiY3VycnkifQ.Sf3GiF3p56nLzoAxEHLXcAckPmmPTtecj1_lGT9oV8s + System.out.println(s); + + //调用自定义API获取结果 + Claims claims = phaseTokenGetBody(s); + //{name=curry} + System.out.println(claims); + } + +} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java deleted file mode 100644 index 1d0c415..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.missiles.modular.system.utils; - -public interface Status { - String OK = "请求成功"; - String FAIL = "请求失败"; - String SYSTEM_ERROR = "系统异常"; - String LOGIN_SUCCEEDED = "登录成功"; - String EMPLOYEE_NOT_EXIS = "员工不存在"; - String USER_ALREADY_REGISTERED = "该账号已注册"; - String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; - String FAILED_CERTIFICATION = "认证不通过"; - String FAILED_PHONE = "授权手机号不正确"; - String PHONE_GET_FAILED = "手机号获取失败"; - String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; - - -} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java index 9d469ae..8af18cc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -2,22 +2,31 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.dao.UserActionMapper; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.JJWTRootUtils; import com.casic.missiles.modular.system.utils.UuidUtils; import com.casic.missiles.modular.system.utils.WXUserUtils; import dm.jdbc.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; +import io.jsonwebtoken.Claims; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service("UserActionService") public class UserActionServiceImpl extends ServiceImpl implements UserActionService { @@ -25,14 +34,39 @@ @Resource private UserActionMapper userActionDao; - @Value("${casic.file.uploadPath}") - private String filePath; + @Resource + private RedisTemplate redisTemplate; + + final String SALT = "y76dniizew"; @Override - public Object userLogin(ParamsDto dto) { + public Object getLoginToken(String code) { + JSONObject jsonObject = WXUserUtils.getOpenId(code); + if(null == jsonObject.get("openid")){ + return ResponseData.error(jsonObject.get("errmsg").toString()); + } + String newOpenid = ShiroKit.md5(jsonObject.get("openid").toString(), SALT); + Map payLoad = new HashMap<>(); + payLoad.put("token", newOpenid); + String token = JJWTRootUtils.generatorToken(payLoad); + if(StringUtil.isNotEmpty(token)){ + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(newOpenid, jsonObject); + redisTemplate.expire(newOpenid, 300 , TimeUnit.SECONDS); + } + return ResponseData.success(token); + } + + @Override + public Object userLogin(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } UserDto userDto = new UserDto(); - String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + //String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + String phone = dto.getPhoneCode(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -40,16 +74,12 @@ UserDto user = userActionDao.getUserInfo(userDto); if(null != user){ if(StringUtil.isEmpty(user.getSyncId())){ - JSONObject jsonObject = WXUserUtils.getOpenId(dto.getCode()); - if(null != jsonObject.get("openid")){ - user.setSyncId(jsonObject.get("openid").toString()); - } + user.setSyncId(jsonObject.get("openid").toString()); List list = userActionDao.getList(user.getSalt()); user.setSalt(list.get(0).getName()); userActionDao.setUserOpenId(user); } - user.setAvatar(filePath+user.getAvatar()); - return ResponseData.success(user); + return ResponseData.success(); }else{ return ResponseData.error(Status.USER_ALREADY_NOT_REGISTERED); } @@ -63,7 +93,8 @@ public Object userRegister(UserDto userDto) { try { SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String phone = WXUserUtils.getPhone(userDto.getPhone()); + //String phone = WXUserUtils.getPhone(userDto.getPhone()); + String phone = userDto.getPhone(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -89,8 +120,12 @@ } @Override - public Object updateUserImg(ParamsDto dto) { + public Object updateUserImg(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } userActionDao.updateUserImg(dto.getFileId(), dto.getUid()); return ResponseData.success(); }catch (Exception e){ @@ -100,8 +135,12 @@ } @Override - public Object getUserJurisdiction(ParamsDto dto) { + public Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } List resList = userActionDao.getUserJurisdiction(dto.getUid()); return ResponseData.success(resList); }catch (Exception e){ @@ -111,6 +150,34 @@ } @Override + public Object getUserInfo(HttpServletRequest request) { + try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } + UserDto userDto = new UserDto(); + userDto.setSyncId(jsonObject.get("openid").toString()); + UserDto user = userActionDao.getUserInfo(userDto); + return ResponseData.success(user); + }catch (Exception e){ + e.printStackTrace(); + return ResponseData.error(Status.FAIL); + } + } + + public JSONObject getLoginStatus(HttpServletRequest request) { + try { + String token = request.getHeader("token"); + Claims claims = JJWTRootUtils.phaseTokenGetBody(token); + return (JSONObject) redisTemplate.opsForValue().get(claims.get("token")); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + @Override public Object getUserType() { try { List list = userActionDao.getList(""); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java new file mode 100644 index 0000000..6fd6672 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java @@ -0,0 +1,113 @@ +package com.casic.missiles.modular.system.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.*; + +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + + +/** + * 生成jwt工具类 + */ +public class JJWTRootUtils { + + //定义对应的编码算法 + static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + //盐值 + static String secretKey = "asdfdsagfdgfdagdafgwetreg"; + + //获取key(指定算法和盐值的key对象) + private static Key generateKey(){ + //将盐值转成字节 + byte[] bytes = DatatypeConverter.parseBase64Binary(secretKey); + //根据算法和盐值生成对应的key值 + Key key = new SecretKeySpec(bytes, signatureAlgorithm.getJcaName()); + return key; + } + + /** + * 将我们的数据使用JWT的方式变成一个token xxx.yyy.zzz + * @param payLoad 负载(数据信息) + * @return + */ + public static String generatorToken(Map payLoad){ + ObjectMapper objectMapper = new ObjectMapper(); + try{ + //构建jwt生成器 + JwtBuilder builder = Jwts.builder(); + //将负载信息设置到jwt生成器中 + JwtBuilder jwtBuilder = builder.setPayload(objectMapper.writeValueAsString(payLoad)); + //根据签名算法和key值,生成新的jwtBuilder + JwtBuilder jwtBuilder1 = jwtBuilder.signWith(signatureAlgorithm, generateKey()); + String token = jwtBuilder1.compact(); + return token; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据指定的token, 返回对应的body信息 + * @param token + * @return + */ + public static Claims phaseTokenGetBody(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + Claims body = claimsJws.getBody();//主要存放的信息 + return body; + } + + /** + * 根据指定的token获取签名信息 + * @param token + * @return + */ + public static String phaseTokenGetSignature(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + String signature = claimsJws.getSignature(); + return signature; + } + + + /** + * 根据指定的token获取头信息 + * @param token + * @return + */ + public static JwsHeader phaseTokenGetHeader(String token){ + //获取解析器 + JwtParser parser = Jwts.parser(); + //设置签名key(盐值) + parser = parser.setSigningKey(generateKey()); + //解析token + Jws claimsJws = parser.parseClaimsJws(token); + JwsHeader header = claimsJws.getHeader(); + return header; + } + + + public static void main(String[] args) { + //随机获取盐值 +// System.out.println(UUID.randomUUID().toString().replaceAll("-", "")); + Map payLoad = new HashMap<>(); + payLoad.put("name", "curry"); + String s = generatorToken(payLoad); + //eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiY3VycnkifQ.Sf3GiF3p56nLzoAxEHLXcAckPmmPTtecj1_lGT9oV8s + System.out.println(s); + + //调用自定义API获取结果 + Claims claims = phaseTokenGetBody(s); + //{name=curry} + System.out.println(claims); + } + +} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java deleted file mode 100644 index 1d0c415..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.missiles.modular.system.utils; - -public interface Status { - String OK = "请求成功"; - String FAIL = "请求失败"; - String SYSTEM_ERROR = "系统异常"; - String LOGIN_SUCCEEDED = "登录成功"; - String EMPLOYEE_NOT_EXIS = "员工不存在"; - String USER_ALREADY_REGISTERED = "该账号已注册"; - String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; - String FAILED_CERTIFICATION = "认证不通过"; - String FAILED_PHONE = "授权手机号不正确"; - String PHONE_GET_FAILED = "手机号获取失败"; - String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; - - -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index bd4cef8..eeeaaec 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -56,6 +56,22 @@ org.springframework.boot spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-data-redis + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.auth0 + java-jwt + 3.7.0 + + com.casic diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java index 9d469ae..8af18cc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -2,22 +2,31 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.dao.UserActionMapper; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.JJWTRootUtils; import com.casic.missiles.modular.system.utils.UuidUtils; import com.casic.missiles.modular.system.utils.WXUserUtils; import dm.jdbc.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; +import io.jsonwebtoken.Claims; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service("UserActionService") public class UserActionServiceImpl extends ServiceImpl implements UserActionService { @@ -25,14 +34,39 @@ @Resource private UserActionMapper userActionDao; - @Value("${casic.file.uploadPath}") - private String filePath; + @Resource + private RedisTemplate redisTemplate; + + final String SALT = "y76dniizew"; @Override - public Object userLogin(ParamsDto dto) { + public Object getLoginToken(String code) { + JSONObject jsonObject = WXUserUtils.getOpenId(code); + if(null == jsonObject.get("openid")){ + return ResponseData.error(jsonObject.get("errmsg").toString()); + } + String newOpenid = ShiroKit.md5(jsonObject.get("openid").toString(), SALT); + Map payLoad = new HashMap<>(); + payLoad.put("token", newOpenid); + String token = JJWTRootUtils.generatorToken(payLoad); + if(StringUtil.isNotEmpty(token)){ + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(newOpenid, jsonObject); + redisTemplate.expire(newOpenid, 300 , TimeUnit.SECONDS); + } + return ResponseData.success(token); + } + + @Override + public Object userLogin(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } UserDto userDto = new UserDto(); - String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + //String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + String phone = dto.getPhoneCode(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -40,16 +74,12 @@ UserDto user = userActionDao.getUserInfo(userDto); if(null != user){ if(StringUtil.isEmpty(user.getSyncId())){ - JSONObject jsonObject = WXUserUtils.getOpenId(dto.getCode()); - if(null != jsonObject.get("openid")){ - user.setSyncId(jsonObject.get("openid").toString()); - } + user.setSyncId(jsonObject.get("openid").toString()); List list = userActionDao.getList(user.getSalt()); user.setSalt(list.get(0).getName()); userActionDao.setUserOpenId(user); } - user.setAvatar(filePath+user.getAvatar()); - return ResponseData.success(user); + return ResponseData.success(); }else{ return ResponseData.error(Status.USER_ALREADY_NOT_REGISTERED); } @@ -63,7 +93,8 @@ public Object userRegister(UserDto userDto) { try { SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String phone = WXUserUtils.getPhone(userDto.getPhone()); + //String phone = WXUserUtils.getPhone(userDto.getPhone()); + String phone = userDto.getPhone(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -89,8 +120,12 @@ } @Override - public Object updateUserImg(ParamsDto dto) { + public Object updateUserImg(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } userActionDao.updateUserImg(dto.getFileId(), dto.getUid()); return ResponseData.success(); }catch (Exception e){ @@ -100,8 +135,12 @@ } @Override - public Object getUserJurisdiction(ParamsDto dto) { + public Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } List resList = userActionDao.getUserJurisdiction(dto.getUid()); return ResponseData.success(resList); }catch (Exception e){ @@ -111,6 +150,34 @@ } @Override + public Object getUserInfo(HttpServletRequest request) { + try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } + UserDto userDto = new UserDto(); + userDto.setSyncId(jsonObject.get("openid").toString()); + UserDto user = userActionDao.getUserInfo(userDto); + return ResponseData.success(user); + }catch (Exception e){ + e.printStackTrace(); + return ResponseData.error(Status.FAIL); + } + } + + public JSONObject getLoginStatus(HttpServletRequest request) { + try { + String token = request.getHeader("token"); + Claims claims = JJWTRootUtils.phaseTokenGetBody(token); + return (JSONObject) redisTemplate.opsForValue().get(claims.get("token")); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + @Override public Object getUserType() { try { List list = userActionDao.getList(""); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java new file mode 100644 index 0000000..6fd6672 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java @@ -0,0 +1,113 @@ +package com.casic.missiles.modular.system.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.*; + +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + + +/** + * 生成jwt工具类 + */ +public class JJWTRootUtils { + + //定义对应的编码算法 + static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + //盐值 + static String secretKey = "asdfdsagfdgfdagdafgwetreg"; + + //获取key(指定算法和盐值的key对象) + private static Key generateKey(){ + //将盐值转成字节 + byte[] bytes = DatatypeConverter.parseBase64Binary(secretKey); + //根据算法和盐值生成对应的key值 + Key key = new SecretKeySpec(bytes, signatureAlgorithm.getJcaName()); + return key; + } + + /** + * 将我们的数据使用JWT的方式变成一个token xxx.yyy.zzz + * @param payLoad 负载(数据信息) + * @return + */ + public static String generatorToken(Map payLoad){ + ObjectMapper objectMapper = new ObjectMapper(); + try{ + //构建jwt生成器 + JwtBuilder builder = Jwts.builder(); + //将负载信息设置到jwt生成器中 + JwtBuilder jwtBuilder = builder.setPayload(objectMapper.writeValueAsString(payLoad)); + //根据签名算法和key值,生成新的jwtBuilder + JwtBuilder jwtBuilder1 = jwtBuilder.signWith(signatureAlgorithm, generateKey()); + String token = jwtBuilder1.compact(); + return token; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据指定的token, 返回对应的body信息 + * @param token + * @return + */ + public static Claims phaseTokenGetBody(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + Claims body = claimsJws.getBody();//主要存放的信息 + return body; + } + + /** + * 根据指定的token获取签名信息 + * @param token + * @return + */ + public static String phaseTokenGetSignature(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + String signature = claimsJws.getSignature(); + return signature; + } + + + /** + * 根据指定的token获取头信息 + * @param token + * @return + */ + public static JwsHeader phaseTokenGetHeader(String token){ + //获取解析器 + JwtParser parser = Jwts.parser(); + //设置签名key(盐值) + parser = parser.setSigningKey(generateKey()); + //解析token + Jws claimsJws = parser.parseClaimsJws(token); + JwsHeader header = claimsJws.getHeader(); + return header; + } + + + public static void main(String[] args) { + //随机获取盐值 +// System.out.println(UUID.randomUUID().toString().replaceAll("-", "")); + Map payLoad = new HashMap<>(); + payLoad.put("name", "curry"); + String s = generatorToken(payLoad); + //eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiY3VycnkifQ.Sf3GiF3p56nLzoAxEHLXcAckPmmPTtecj1_lGT9oV8s + System.out.println(s); + + //调用自定义API获取结果 + Claims claims = phaseTokenGetBody(s); + //{name=curry} + System.out.println(claims); + } + +} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java deleted file mode 100644 index 1d0c415..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.missiles.modular.system.utils; - -public interface Status { - String OK = "请求成功"; - String FAIL = "请求失败"; - String SYSTEM_ERROR = "系统异常"; - String LOGIN_SUCCEEDED = "登录成功"; - String EMPLOYEE_NOT_EXIS = "员工不存在"; - String USER_ALREADY_REGISTERED = "该账号已注册"; - String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; - String FAILED_CERTIFICATION = "认证不通过"; - String FAILED_PHONE = "授权手机号不正确"; - String PHONE_GET_FAILED = "手机号获取失败"; - String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; - - -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index bd4cef8..eeeaaec 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -56,6 +56,22 @@ org.springframework.boot spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-data-redis + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.auth0 + java-jwt + 3.7.0 + + com.casic diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 083a82f..f7ca146 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -7,6 +7,9 @@ url: jdbc:mysql://111.198.10.15:11336/casic_security_cockpit_mini?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root password: Casic203 + redis: + host: 127.0.0.1 + port: 6379 # session: # store-type: redis diff --git a/casic-server/pom.xml b/casic-server/pom.xml index dca98c3..060eae2 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -88,6 +88,18 @@ casic-export-support ${extension.version} + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + com.auth0 + java-jwt + 3.7.0 + compile + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java index b4754dd..e45be89 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/controller/UserController.java @@ -2,19 +2,18 @@ import com.alibaba.fastjson.JSONObject; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.*; -import dm.jdbc.util.StringUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; /** * @Description: 小程序用户 @@ -28,13 +27,19 @@ @Resource private UserActionService userActionService; + @RequestMapping("getLoginToken") + @ResponseBody + public Object getLoginToken(String code){ + return userActionService.getLoginToken(code); + } + /** - * 登录 + * 认证手机号登录 */ @RequestMapping("userLogin") @ResponseBody - public Object userLogin(@RequestBody ParamsDto dto){ - return userActionService.userLogin(dto); + public Object userLogin(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.userLogin(dto,request); } /** @@ -58,36 +63,26 @@ */ @RequestMapping("updateUserImg") @ResponseBody - public Object updateUserImg(@RequestBody ParamsDto dto){ - return userActionService.updateUserImg(dto); + public Object updateUserImg(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.updateUserImg(dto,request); } /** * 获取用户权限 */ @RequestMapping("getUserJurisdiction") @ResponseBody - public Object getUserJurisdiction(@RequestBody ParamsDto dto){ - return userActionService.getUserJurisdiction(dto); + public Object getUserJurisdiction(@RequestBody ParamsDto dto, HttpServletRequest request){ + return userActionService.getUserJurisdiction(dto,request); } /** - * 修改密码 + * 获取用户信息 */ - - /** - * 员工导入 - */ - /** - * 获取微信openid,sessionkey等信息 - */ - @RequestMapping("getWxOpenidInfo") + @RequestMapping("getUserInfo") @ResponseBody - public Object getWxOpenidInfo(@RequestParam String code) { - if (StringUtil.isEmpty(code)) { - return null; - } - JSONObject jsonObject = WXUserUtils.getOpenId(code); - return ResponseData.success(jsonObject); + public Object getUserInfo(HttpServletRequest request){ + return userActionService.getUserInfo(request); } + /** * 获取微信手机号 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java new file mode 100644 index 0000000..6de6999 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/enums/Status.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.system.enums; + +public interface Status { + String OK = "请求成功"; + String FAIL = "请求失败"; + String SYSTEM_ERROR = "系统异常"; + String LOGIN_SUCCEEDED = "登录成功"; + String EMPLOYEE_NOT_EXIS = "员工不存在"; + String USER_ALREADY_REGISTERED = "该账号已注册"; + String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; + String FAILED_CERTIFICATION = "认证不通过"; + String FAILED_PHONE = "授权手机号不正确"; + String PHONE_GET_FAILED = "手机号获取失败"; + String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; + String TOKEN_EXPIRES = "登录过期,请重新登录"; + + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java index a1608fd..4a9527f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/UserActionService.java @@ -5,15 +5,21 @@ import com.casic.missiles.modular.system.dto.ParamsDto; import com.casic.missiles.modular.system.model.Dict; +import javax.servlet.http.HttpServletRequest; + public interface UserActionService extends IService { Object getUserType(); Object userRegister(UserDto userDto); - Object userLogin(ParamsDto dto); + Object userLogin(ParamsDto dto, HttpServletRequest request); - Object updateUserImg(ParamsDto dto); + Object updateUserImg(ParamsDto dto, HttpServletRequest request); - Object getUserJurisdiction(ParamsDto dto); + Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request); + + Object getLoginToken(String code); + + Object getUserInfo(HttpServletRequest request); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java index 9d469ae..8af18cc 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/service/impl/UserActionServiceImpl.java @@ -2,22 +2,31 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.system.dao.UserActionMapper; -import com.casic.missiles.modular.system.dto.UserDto; import com.casic.missiles.modular.system.dto.ParamsDto; +import com.casic.missiles.modular.system.dto.UserDto; +import com.casic.missiles.modular.system.enums.Status; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.system.service.UserActionService; -import com.casic.missiles.modular.system.utils.Status; +import com.casic.missiles.modular.system.utils.JJWTRootUtils; import com.casic.missiles.modular.system.utils.UuidUtils; import com.casic.missiles.modular.system.utils.WXUserUtils; import dm.jdbc.util.StringUtil; -import org.springframework.beans.factory.annotation.Value; +import io.jsonwebtoken.Claims; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Service("UserActionService") public class UserActionServiceImpl extends ServiceImpl implements UserActionService { @@ -25,14 +34,39 @@ @Resource private UserActionMapper userActionDao; - @Value("${casic.file.uploadPath}") - private String filePath; + @Resource + private RedisTemplate redisTemplate; + + final String SALT = "y76dniizew"; @Override - public Object userLogin(ParamsDto dto) { + public Object getLoginToken(String code) { + JSONObject jsonObject = WXUserUtils.getOpenId(code); + if(null == jsonObject.get("openid")){ + return ResponseData.error(jsonObject.get("errmsg").toString()); + } + String newOpenid = ShiroKit.md5(jsonObject.get("openid").toString(), SALT); + Map payLoad = new HashMap<>(); + payLoad.put("token", newOpenid); + String token = JJWTRootUtils.generatorToken(payLoad); + if(StringUtil.isNotEmpty(token)){ + ValueOperations operations = redisTemplate.opsForValue(); + operations.set(newOpenid, jsonObject); + redisTemplate.expire(newOpenid, 300 , TimeUnit.SECONDS); + } + return ResponseData.success(token); + } + + @Override + public Object userLogin(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } UserDto userDto = new UserDto(); - String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + //String phone = WXUserUtils.getPhone(dto.getPhoneCode()); + String phone = dto.getPhoneCode(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -40,16 +74,12 @@ UserDto user = userActionDao.getUserInfo(userDto); if(null != user){ if(StringUtil.isEmpty(user.getSyncId())){ - JSONObject jsonObject = WXUserUtils.getOpenId(dto.getCode()); - if(null != jsonObject.get("openid")){ - user.setSyncId(jsonObject.get("openid").toString()); - } + user.setSyncId(jsonObject.get("openid").toString()); List list = userActionDao.getList(user.getSalt()); user.setSalt(list.get(0).getName()); userActionDao.setUserOpenId(user); } - user.setAvatar(filePath+user.getAvatar()); - return ResponseData.success(user); + return ResponseData.success(); }else{ return ResponseData.error(Status.USER_ALREADY_NOT_REGISTERED); } @@ -63,7 +93,8 @@ public Object userRegister(UserDto userDto) { try { SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String phone = WXUserUtils.getPhone(userDto.getPhone()); + //String phone = WXUserUtils.getPhone(userDto.getPhone()); + String phone = userDto.getPhone(); if(phone.equals("GetFailed")){ return ResponseData.error(Status.PHONE_GET_FAILED); } @@ -89,8 +120,12 @@ } @Override - public Object updateUserImg(ParamsDto dto) { + public Object updateUserImg(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } userActionDao.updateUserImg(dto.getFileId(), dto.getUid()); return ResponseData.success(); }catch (Exception e){ @@ -100,8 +135,12 @@ } @Override - public Object getUserJurisdiction(ParamsDto dto) { + public Object getUserJurisdiction(ParamsDto dto, HttpServletRequest request) { try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } List resList = userActionDao.getUserJurisdiction(dto.getUid()); return ResponseData.success(resList); }catch (Exception e){ @@ -111,6 +150,34 @@ } @Override + public Object getUserInfo(HttpServletRequest request) { + try { + JSONObject jsonObject = getLoginStatus(request); + if(null == jsonObject){ + return ResponseData.error(Status.TOKEN_EXPIRES); + } + UserDto userDto = new UserDto(); + userDto.setSyncId(jsonObject.get("openid").toString()); + UserDto user = userActionDao.getUserInfo(userDto); + return ResponseData.success(user); + }catch (Exception e){ + e.printStackTrace(); + return ResponseData.error(Status.FAIL); + } + } + + public JSONObject getLoginStatus(HttpServletRequest request) { + try { + String token = request.getHeader("token"); + Claims claims = JJWTRootUtils.phaseTokenGetBody(token); + return (JSONObject) redisTemplate.opsForValue().get(claims.get("token")); + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + @Override public Object getUserType() { try { List list = userActionDao.getList(""); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java new file mode 100644 index 0000000..6fd6672 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/JJWTRootUtils.java @@ -0,0 +1,113 @@ +package com.casic.missiles.modular.system.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.jsonwebtoken.*; + +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.security.Key; +import java.util.HashMap; +import java.util.Map; + + +/** + * 生成jwt工具类 + */ +public class JJWTRootUtils { + + //定义对应的编码算法 + static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; + //盐值 + static String secretKey = "asdfdsagfdgfdagdafgwetreg"; + + //获取key(指定算法和盐值的key对象) + private static Key generateKey(){ + //将盐值转成字节 + byte[] bytes = DatatypeConverter.parseBase64Binary(secretKey); + //根据算法和盐值生成对应的key值 + Key key = new SecretKeySpec(bytes, signatureAlgorithm.getJcaName()); + return key; + } + + /** + * 将我们的数据使用JWT的方式变成一个token xxx.yyy.zzz + * @param payLoad 负载(数据信息) + * @return + */ + public static String generatorToken(Map payLoad){ + ObjectMapper objectMapper = new ObjectMapper(); + try{ + //构建jwt生成器 + JwtBuilder builder = Jwts.builder(); + //将负载信息设置到jwt生成器中 + JwtBuilder jwtBuilder = builder.setPayload(objectMapper.writeValueAsString(payLoad)); + //根据签名算法和key值,生成新的jwtBuilder + JwtBuilder jwtBuilder1 = jwtBuilder.signWith(signatureAlgorithm, generateKey()); + String token = jwtBuilder1.compact(); + return token; + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据指定的token, 返回对应的body信息 + * @param token + * @return + */ + public static Claims phaseTokenGetBody(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + Claims body = claimsJws.getBody();//主要存放的信息 + return body; + } + + /** + * 根据指定的token获取签名信息 + * @param token + * @return + */ + public static String phaseTokenGetSignature(String token){ + JwtParser jwtParser = Jwts.parser().setSigningKey(generateKey()); + Jws claimsJws = jwtParser.parseClaimsJws(token); + String signature = claimsJws.getSignature(); + return signature; + } + + + /** + * 根据指定的token获取头信息 + * @param token + * @return + */ + public static JwsHeader phaseTokenGetHeader(String token){ + //获取解析器 + JwtParser parser = Jwts.parser(); + //设置签名key(盐值) + parser = parser.setSigningKey(generateKey()); + //解析token + Jws claimsJws = parser.parseClaimsJws(token); + JwsHeader header = claimsJws.getHeader(); + return header; + } + + + public static void main(String[] args) { + //随机获取盐值 +// System.out.println(UUID.randomUUID().toString().replaceAll("-", "")); + Map payLoad = new HashMap<>(); + payLoad.put("name", "curry"); + String s = generatorToken(payLoad); + //eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiY3VycnkifQ.Sf3GiF3p56nLzoAxEHLXcAckPmmPTtecj1_lGT9oV8s + System.out.println(s); + + //调用自定义API获取结果 + Claims claims = phaseTokenGetBody(s); + //{name=curry} + System.out.println(claims); + } + +} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java b/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java deleted file mode 100644 index 1d0c415..0000000 --- a/casic-server/src/main/java/com/casic/missiles/modular/system/utils/Status.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.casic.missiles.modular.system.utils; - -public interface Status { - String OK = "请求成功"; - String FAIL = "请求失败"; - String SYSTEM_ERROR = "系统异常"; - String LOGIN_SUCCEEDED = "登录成功"; - String EMPLOYEE_NOT_EXIS = "员工不存在"; - String USER_ALREADY_REGISTERED = "该账号已注册"; - String USER_ALREADY_NOT_REGISTERED = "您的账号未注册,请先注册"; - String FAILED_CERTIFICATION = "认证不通过"; - String FAILED_PHONE = "授权手机号不正确"; - String PHONE_GET_FAILED = "手机号获取失败"; - String EMPLOYEE_NAME_MISMATCH = "员工号与姓名不匹配"; - - -} diff --git a/casic-web/pom.xml b/casic-web/pom.xml index bd4cef8..eeeaaec 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -56,6 +56,22 @@ org.springframework.boot spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-data-redis + + + io.jsonwebtoken + jjwt + 0.9.1 + + + com.auth0 + java-jwt + 3.7.0 + + com.casic diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 083a82f..f7ca146 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -7,6 +7,9 @@ url: jdbc:mysql://111.198.10.15:11336/casic_security_cockpit_mini?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTC&&allowMultiQueries=true username: root password: Casic203 + redis: + host: 127.0.0.1 + port: 6379 # session: # store-type: redis diff --git a/casic-web/src/main/resources/mapper/UserActionMapper.xml b/casic-web/src/main/resources/mapper/UserActionMapper.xml index 0cece09..b7b0bab 100644 --- a/casic-web/src/main/resources/mapper/UserActionMapper.xml +++ b/casic-web/src/main/resources/mapper/UserActionMapper.xml @@ -28,6 +28,9 @@ and t.PHONE = #{userDto.attr1} + + and t.SYNC_ID = #{userDto.syncId} + UPDATE sys_user SET `PHONE` = #{userDto.phone},`SALT`=#{userDto.salt} WHERE `ACCOUNT` = #{userDto.account} and `NAME` = #{userDto.name}