From d39ec4c92fb0d5fc34a2949c6595f8e10426237c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A7=9C=E7=8E=89=E7=90=A6?= <7507756+jiang_yuqi@user.noreply.gitee.com> Date: Tue, 15 Oct 2024 23:55:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/TokenController.java | 33 +++++++++++-- .../yanzhu/auth/service/SysLoginService.java | 48 +++++++++++++++++++ .../common/security/service/TokenService.java | 46 ++++++++++++++++++ .../controller/SysUserUniopenController.java | 2 +- yanzhu-ui-app/miniprogram/api/login.js | 12 ++--- yanzhu-ui-app/miniprogram/config.js | 2 +- .../miniprogram/pages/login/login.js | 23 +++++---- yanzhu-ui-vue3/src/api/login.js | 2 +- 8 files changed, 144 insertions(+), 24 deletions(-) diff --git a/yanzhu-auth/src/main/java/com/yanzhu/auth/controller/TokenController.java b/yanzhu-auth/src/main/java/com/yanzhu/auth/controller/TokenController.java index b77c4aa5..1065c442 100644 --- a/yanzhu-auth/src/main/java/com/yanzhu/auth/controller/TokenController.java +++ b/yanzhu-auth/src/main/java/com/yanzhu/auth/controller/TokenController.java @@ -85,6 +85,20 @@ public class TokenController return R.ok(maOpenId); } + /** + * 账号密码登录 微信 + * @param form + * @return + */ + @PostMapping("wxLogin") + public R wxLogin(@RequestBody LoginBody form) + { + // 用户登录 + LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword()); + // 获取登录token + return R.ok(tokenService.createMobileToken(userInfo)); + } + /** * 微信小程序一键登录 * @param body 请求参数 @@ -96,7 +110,7 @@ public class TokenController // 微信用户登录 LoginUser userInfo = sysLoginService.maLogin(body); // 获取登录token - return R.ok(tokenService.createToken(userInfo)); + return R.ok(tokenService.createMobileToken(userInfo)); } /** @@ -197,7 +211,7 @@ public class TokenController return R.ok(); } - @PostMapping("refresh") + @GetMapping("refresh") public R refresh(HttpServletRequest request) { LoginUser loginUser = tokenService.getLoginUser(request); @@ -207,7 +221,20 @@ public class TokenController tokenService.refreshToken(loginUser); return R.ok(); } - return R.ok(); + return R.fail(); + } + + @GetMapping("refreshMobile") + public R refreshMobile(HttpServletRequest request) + { + LoginUser loginUser = sysLoginService.wxLogin(SecurityUtils.getUsername()); + if (StringUtils.isNotNull(loginUser)) + { + // 刷新令牌有效期 + tokenService.refreshToken(loginUser); + return R.ok(); + } + return R.fail(); } @PostMapping("register") diff --git a/yanzhu-auth/src/main/java/com/yanzhu/auth/service/SysLoginService.java b/yanzhu-auth/src/main/java/com/yanzhu/auth/service/SysLoginService.java index 26972b52..8c6488d9 100644 --- a/yanzhu-auth/src/main/java/com/yanzhu/auth/service/SysLoginService.java +++ b/yanzhu-auth/src/main/java/com/yanzhu/auth/service/SysLoginService.java @@ -142,6 +142,54 @@ public class SysLoginService return Convert.toStr(phoneResult.get("phoneNumber")); } + /** + * 微信小程序登录 + */ + public LoginUser wxLogin(String username) + { + // 查询用户信息 + R userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER); + + if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) + { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在"); + throw new ServiceException("登录用户:" + username + " 不存在"); + } + + if (R.FAIL == userResult.getCode()) + { + throw new ServiceException(userResult.getMsg()); + } + + LoginUser userInfo = userResult.getData(); + SysUser user = userResult.getData().getSysUser(); + if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除"); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员"); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + + // 补充用户项目信息 + if(Objects.nonNull(user.getActiveComId())){ + userInfo.setProjectDeptId(user.getActiveComId()); + } + if(Objects.nonNull(user.getActiveComName())){ + userInfo.setProjectDeptName(user.getActiveComName()); + } + if(Objects.nonNull(user.getActiveProjectId())){ + userInfo.setProjectId(user.getActiveProjectId()); + } + if(Objects.nonNull(user.getActiveProjectName())){ + userInfo.setProjectName(user.getActiveProjectName()); + } + return userInfo; + } + /** * 微信小程序登录 */ diff --git a/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/service/TokenService.java b/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/service/TokenService.java index aab600a2..c877acf5 100644 --- a/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/service/TokenService.java +++ b/yanzhu-common/yanzhu-common-security/src/main/java/com/yanzhu/common/security/service/TokenService.java @@ -4,6 +4,10 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; + +import com.yanzhu.common.core.constant.Constants; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.yanzhu.common.core.constant.CacheConstants; @@ -65,6 +69,33 @@ public class TokenService return rspMap; } + /** + * 创建令牌 + */ + public Map createMobileToken(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + Long userId = loginUser.getSysUser().getUserId(); + String userName = loginUser.getSysUser().getUserName(); + loginUser.setToken(token); + loginUser.setUserid(userId); + loginUser.setUsername(userName); + loginUser.setIpaddr(IpUtils.getIpAddr()); + refreshMobileToken(loginUser); + + // Jwt存储信息 + Map claimsMap = new HashMap(); + claimsMap.put(SecurityConstants.USER_KEY, token); + claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); + claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); + + // 接口返回信息 + Map rspMap = new HashMap(); + rspMap.put("access_token", JwtUtils.createToken(claimsMap)); + rspMap.put("expires_in", expireTime); + return rspMap; + } + /** * 获取用户身份信息 * @@ -162,6 +193,21 @@ public class TokenService redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); } + /** + * 移动端主动刷新令牌有效期 && 长期 + * + * @param loginUser 登录信息 + */ + public void refreshMobileToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + long exTime = (expireTime * MILLIS_MINUTE) * 9999; + loginUser.setExpireTime(loginUser.getLoginTime() + exTime); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisService.setCacheObject(userKey, loginUser, expireTime * 9999, TimeUnit.MINUTES); + } + private String getTokenKey(String token) { return ACCESS_TOKEN + token; diff --git a/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserUniopenController.java b/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserUniopenController.java index bc0c07a8..0ac8f640 100644 --- a/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserUniopenController.java +++ b/yanzhu-modules/yanzhu-system/src/main/java/com/yanzhu/system/controller/SysUserUniopenController.java @@ -134,7 +134,7 @@ public class SysUserUniopenController extends BaseController * 小程序授权 */ @InnerAuth - @GetMapping("/getMaPhoneNumber") + @PostMapping("/getMaPhoneNumber") public R> getMaPhoneNumber(@RequestBody WxMaLoginBody body) { try { // 调用解密方法获取手机号 diff --git a/yanzhu-ui-app/miniprogram/api/login.js b/yanzhu-ui-app/miniprogram/api/login.js index 89796c77..37ae0aad 100644 --- a/yanzhu-ui-app/miniprogram/api/login.js +++ b/yanzhu-ui-app/miniprogram/api/login.js @@ -9,9 +9,9 @@ export function getCodeImg() { } // 登录方法 -export function login(data) { +export function wxLogin(data) { return request({ - url: '/wxApi/login', + url: '/auth/wxLogin', method: 'post', data: data, }) @@ -29,7 +29,7 @@ export function getMaOpenId(data) { // 登录方法 export function maLogin(data) { return request({ - url: '/maLogin', + url: '/auth/maLogin', method: 'post', data: data, }) @@ -47,15 +47,15 @@ export function updatePwd(data) { // 用户退出方法 export function loginOut() { return request({ - 'url': '/wxApi/loginOut', + 'url': '/auth/logout', 'method': 'get' }) } // 刷线用户信息 -export function refreshUser() { +export function refreshMobileToken() { return request({ - 'url': '/wxApi/refreshUserInfo', + 'url': '/auth/refreshMobile', 'method': 'get' }) } diff --git a/yanzhu-ui-app/miniprogram/config.js b/yanzhu-ui-app/miniprogram/config.js index c50673f3..62dcab21 100644 --- a/yanzhu-ui-app/miniprogram/config.js +++ b/yanzhu-ui-app/miniprogram/config.js @@ -3,5 +3,5 @@ module.exports = { timeout: 60000, appId: "wx2350a5efb3f28e66", baseUrl: 'http://127.0.0.1:8080', - noSecuritys:['/code','/auth/login','/auth/getMaOpenId','/auth/getMaPhoneNumber','/auth/maLogin'] + noSecuritys:['/code','/auth/wxLogin','/auth/getMaOpenId','/auth/getMaPhoneNumber','/auth/maLogin'] }; \ No newline at end of file diff --git a/yanzhu-ui-app/miniprogram/pages/login/login.js b/yanzhu-ui-app/miniprogram/pages/login/login.js index b88b9200..b1bb4f65 100644 --- a/yanzhu-ui-app/miniprogram/pages/login/login.js +++ b/yanzhu-ui-app/miniprogram/pages/login/login.js @@ -7,11 +7,11 @@ import { setSessionKey, } from '../../utils/auth' import { - login, + wxLogin, maLogin, getCodeImg, getMaOpenId, - refreshUser, + refreshMobileToken, } from '../../api/login' const app = getApp(); @@ -53,7 +53,7 @@ Page({ if (getToken()) { console.log("Authorization...{}", getToken()); //刷新权限信息 - refreshUser().then(res => { + refreshMobileToken().then(res => { if (res.code == '200') { wx.redirectTo({ url: '../index/index', @@ -114,7 +114,7 @@ Page({ //启动蒙版 let that = this; //发送请求 - login({ + wxLogin({ "username": username, "password": password, "code": code, @@ -140,18 +140,17 @@ Page({ iv: e.detail.iv, encryptedData: e.detail.encryptedData } - maLogin({}) + maLogin(data).then(res =>{ + setToken(res.access_token) + //跳转页面 + wx.redirectTo({ + url: '../index/index', + }) + }) }else{ //用户决绝授权 app.toast("请允许微信手机号一键登录"); } - maLogin(data).then(res =>{ - setToken(res.access_token) - //跳转页面 - wx.redirectTo({ - url: '../index/index', - }) - }) }, }) \ No newline at end of file diff --git a/yanzhu-ui-vue3/src/api/login.js b/yanzhu-ui-vue3/src/api/login.js index a4f2feb9..d0b1e800 100644 --- a/yanzhu-ui-vue3/src/api/login.js +++ b/yanzhu-ui-vue3/src/api/login.js @@ -28,7 +28,7 @@ export function register(data) { export function refreshToken() { return request({ url: '/auth/refresh', - method: 'post' + method: 'get' }) }