token修改及实验课程
parent
692f6225a3
commit
8f198ea261
|
|
@ -52,4 +52,10 @@ public interface RemoteUserService extends InnerRemoteUserService
|
||||||
*/
|
*/
|
||||||
@PutMapping("/user/recordlogin")
|
@PutMapping("/user/recordlogin")
|
||||||
public R<Boolean> recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
|
public R<Boolean> recordUserLogin(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步至go框架
|
||||||
|
*/
|
||||||
|
@PostMapping("/user/syncGO")
|
||||||
|
public R<Boolean> syncGO(@RequestBody SysUser sysUser);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,11 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
|
||||||
return R.fail("记录用户登录信息失败:" + throwable.getMessage());
|
return R.fail("记录用户登录信息失败:" + throwable.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R<Boolean> syncGO(SysUser sysUser) {
|
||||||
|
return R.fail("同步用户信息至GO失败:" + throwable.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public R<LoginUser> edit_Inner(@NotNull LoginUser user, @NotNull String source) {
|
public R<LoginUser> edit_Inner(@NotNull LoginUser user, @NotNull String source) {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,20 @@ public class SecurityConstants
|
||||||
*/
|
*/
|
||||||
public static final String DETAILS_USER_ID = "user_id";
|
public static final String DETAILS_USER_ID = "user_id";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户ID字段
|
||||||
|
*/
|
||||||
|
public static final String DETAILS_SUB = "sub";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户ID字段
|
||||||
|
*/
|
||||||
|
public static final String DETAILS_IAT= "iat";
|
||||||
|
/**
|
||||||
|
* 用户ID字段
|
||||||
|
*/
|
||||||
|
public static final String DETAILS_EXP= "exp";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户名字段
|
* 用户名字段
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,18 @@
|
||||||
package com.ruoyi.common.core.utils;
|
package com.ruoyi.common.core.utils;
|
||||||
|
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import com.ruoyi.common.core.constant.SecurityConstants;
|
import com.ruoyi.common.core.constant.SecurityConstants;
|
||||||
import com.ruoyi.common.core.constant.TokenConstants;
|
import com.ruoyi.common.core.constant.TokenConstants;
|
||||||
|
import com.ruoyi.common.core.exception.ServiceException;
|
||||||
import com.ruoyi.common.core.text.Convert;
|
import com.ruoyi.common.core.text.Convert;
|
||||||
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.Claims;
|
||||||
import io.jsonwebtoken.Jwts;
|
import io.jsonwebtoken.Jwts;
|
||||||
import io.jsonwebtoken.SignatureAlgorithm;
|
import io.jsonwebtoken.SignatureAlgorithm;
|
||||||
|
|
||||||
|
import javax.naming.AuthenticationException;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Jwt工具类
|
* Jwt工具类
|
||||||
*
|
*
|
||||||
|
|
@ -15,7 +20,7 @@ import io.jsonwebtoken.SignatureAlgorithm;
|
||||||
*/
|
*/
|
||||||
public class JwtUtils
|
public class JwtUtils
|
||||||
{
|
{
|
||||||
public static String secret = TokenConstants.SECRET;
|
public static String secret = Base64.getEncoder().encodeToString(TokenConstants.SECRET.getBytes()) ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 从数据声明生成令牌
|
* 从数据声明生成令牌
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,14 @@
|
||||||
package com.ruoyi.common.security.service;
|
package com.ruoyi.common.security.service;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import io.jsonwebtoken.Claims;
|
||||||
|
import io.jsonwebtoken.Jwts;
|
||||||
|
import io.jsonwebtoken.impl.DefaultClaims;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
@ -61,6 +66,10 @@ public class TokenService
|
||||||
claimsMap.put(SecurityConstants.USER_KEY, token);
|
claimsMap.put(SecurityConstants.USER_KEY, token);
|
||||||
claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
|
claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
|
||||||
claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
|
claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
|
||||||
|
claimsMap.put(SecurityConstants.DETAILS_SUB,userId);
|
||||||
|
int now = Math.toIntExact(System.currentTimeMillis() / 1000);
|
||||||
|
claimsMap.put(SecurityConstants.DETAILS_IAT,now);
|
||||||
|
claimsMap.put(SecurityConstants.DETAILS_EXP,now+TOKEN_EXPIRE_TIME*60);
|
||||||
|
|
||||||
// 接口返回信息
|
// 接口返回信息
|
||||||
Map<String, Object> rspMap = new HashMap<String, Object>();
|
Map<String, Object> rspMap = new HashMap<String, Object>();
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,6 @@ public class AuthFilter implements GlobalFilter, Ordered
|
||||||
{
|
{
|
||||||
ServerHttpRequest request = exchange.getRequest();
|
ServerHttpRequest request = exchange.getRequest();
|
||||||
ServerHttpRequest.Builder mutate = request.mutate();
|
ServerHttpRequest.Builder mutate = request.mutate();
|
||||||
|
|
||||||
String url = request.getURI().getPath();
|
String url = request.getURI().getPath();
|
||||||
// 跳过不需要验证的路径
|
// 跳过不需要验证的路径
|
||||||
if (StringUtils.matches(url, ignoreWhite.getWhites()))
|
if (StringUtils.matches(url, ignoreWhite.getWhites()))
|
||||||
|
|
@ -56,10 +55,18 @@ public class AuthFilter implements GlobalFilter, Ordered
|
||||||
{
|
{
|
||||||
return unauthorizedResponse(exchange, "令牌不能为空");
|
return unauthorizedResponse(exchange, "令牌不能为空");
|
||||||
}
|
}
|
||||||
Claims claims = JwtUtils.parseToken(token);
|
/*Claims claims = JwtUtils.parseToken(token);
|
||||||
if (claims == null)
|
if (claims == null)
|
||||||
{
|
{
|
||||||
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
|
}*/
|
||||||
|
Claims claims;
|
||||||
|
try{
|
||||||
|
claims = JwtUtils.parseToken(token);
|
||||||
|
if (claims == null)
|
||||||
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
|
}catch (Exception e){
|
||||||
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
}
|
}
|
||||||
String userkey = JwtUtils.getUserKey(claims);
|
String userkey = JwtUtils.getUserKey(claims);
|
||||||
boolean islogin = redisService.hasKey(getTokenKey(userkey));
|
boolean islogin = redisService.hasKey(getTokenKey(userkey));
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@ public class GatewayExceptionHandler implements ErrorWebExceptionHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
String msg;
|
String msg;
|
||||||
|
|
||||||
if (ex instanceof NotFoundException)
|
if (ex instanceof NotFoundException)
|
||||||
{
|
{
|
||||||
msg = "服务未找到";
|
msg = "服务未找到";
|
||||||
|
|
|
||||||
|
|
@ -27,8 +27,10 @@ public class LiveTask {
|
||||||
public void CourseSmsNotice(){
|
public void CourseSmsNotice(){
|
||||||
List<ScClassUserInfo> list = scClassUserInfoMapper.waitNoticeCourseUser();
|
List<ScClassUserInfo> list = scClassUserInfoMapper.waitNoticeCourseUser();
|
||||||
list.forEach(item->{
|
list.forEach(item->{
|
||||||
log.info("发送打卡提醒",item.getUserId(),item.getNickName(),item.getPhonenumber());
|
if (item.getPhonenumber() != null && !item.getPhonenumber().trim().isEmpty()){
|
||||||
|
log.info("发送打卡提醒 {} {} {}",item.getUserId(),item.getNickName(),item.getPhonenumber());
|
||||||
smsAliyuncs.sendStudyNoticeSms(item.getPhonenumber());
|
smsAliyuncs.sendStudyNoticeSms(item.getPhonenumber());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,16 @@ public class SysUserController extends BaseController
|
||||||
return R.ok(userService.updateUserProfile(sysUser));
|
return R.ok(userService.updateUserProfile(sysUser));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*记录用户登录IP地址和登录时间
|
||||||
|
*/
|
||||||
|
@InnerAuth
|
||||||
|
@PutMapping("/syncGO")
|
||||||
|
public R<Boolean> syncGO(@RequestBody SysUser sysUser)
|
||||||
|
{
|
||||||
|
return R.ok(userService.syncGO(sysUser));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户信息
|
* 获取用户信息
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.ruoyi.system.domain;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class SyncGoUser {
|
||||||
|
private Integer userId;
|
||||||
|
private String nickname;
|
||||||
|
private String username;
|
||||||
|
private String mobile;
|
||||||
|
private String lastIp;
|
||||||
|
private String remark;
|
||||||
|
private String avatar;
|
||||||
|
private Integer status;
|
||||||
|
}
|
||||||
|
|
@ -170,6 +170,14 @@ public interface ISysUserService
|
||||||
*/
|
*/
|
||||||
public boolean updateUserProfile(SysUser user);
|
public boolean updateUserProfile(SysUser user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步用户基本信息
|
||||||
|
*
|
||||||
|
* @param user 用户信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public boolean syncGO(SysUser user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改用户头像
|
* 修改用户头像
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,17 @@ import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import javax.validation.Validator;
|
import javax.validation.Validator;
|
||||||
|
|
||||||
|
import cn.hutool.system.UserInfo;
|
||||||
import com.github.pagehelper.Page;
|
import com.github.pagehelper.Page;
|
||||||
import com.ruoyi.system.api.domain.KSysUserAccount;
|
import com.ruoyi.system.api.domain.KSysUserAccount;
|
||||||
|
import com.ruoyi.system.domain.SyncGoUser;
|
||||||
import com.ruoyi.system.service.IKSysUserService;
|
import com.ruoyi.system.service.IKSysUserService;
|
||||||
|
import org.apache.http.client.methods.HttpPost;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
@ -35,6 +40,7 @@ import com.ruoyi.system.mapper.SysUserRoleMapper;
|
||||||
import com.ruoyi.system.service.ISysConfigService;
|
import com.ruoyi.system.service.ISysConfigService;
|
||||||
import com.ruoyi.system.service.ISysDeptService;
|
import com.ruoyi.system.service.ISysDeptService;
|
||||||
import com.ruoyi.system.service.ISysUserService;
|
import com.ruoyi.system.service.ISysUserService;
|
||||||
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户 业务层处理
|
* 用户 业务层处理
|
||||||
|
|
@ -44,6 +50,11 @@ import com.ruoyi.system.service.ISysUserService;
|
||||||
@Service
|
@Service
|
||||||
public class SysUserServiceImpl implements ISysUserService
|
public class SysUserServiceImpl implements ISysUserService
|
||||||
{
|
{
|
||||||
|
@Value("${go.host}")
|
||||||
|
private String goHost;
|
||||||
|
@Value("${go.accessKey}")
|
||||||
|
private String accessKey;
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
|
private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -73,6 +84,7 @@ public class SysUserServiceImpl implements ISysUserService
|
||||||
@Autowired
|
@Autowired
|
||||||
protected Validator validator;
|
protected Validator validator;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据条件分页查询用户列表
|
* 根据条件分页查询用户列表
|
||||||
*
|
*
|
||||||
|
|
@ -308,7 +320,9 @@ public class SysUserServiceImpl implements ISysUserService
|
||||||
@Override
|
@Override
|
||||||
public boolean registerUser(SysUser user)
|
public boolean registerUser(SysUser user)
|
||||||
{
|
{
|
||||||
return userMapper.insertUser(user) > 0;
|
boolean res = userMapper.insertUser(user) > 0;
|
||||||
|
this.syncGO(user);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -335,6 +349,7 @@ public class SysUserServiceImpl implements ISysUserService
|
||||||
kSysUserService.updateSysUserAccount(user.getSysUserAccount());
|
kSysUserService.updateSysUserAccount(user.getSysUserAccount());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.syncGO(user);
|
||||||
return userMapper.updateUser(user);
|
return userMapper.updateUser(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -361,6 +376,7 @@ public class SysUserServiceImpl implements ISysUserService
|
||||||
@Override
|
@Override
|
||||||
public int updateUserStatus(SysUser user)
|
public int updateUserStatus(SysUser user)
|
||||||
{
|
{
|
||||||
|
this.syncGO(user);
|
||||||
return userMapper.updateUser(user);
|
return userMapper.updateUser(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -373,9 +389,39 @@ public class SysUserServiceImpl implements ISysUserService
|
||||||
@Override
|
@Override
|
||||||
public boolean updateUserProfile(SysUser user)
|
public boolean updateUserProfile(SysUser user)
|
||||||
{
|
{
|
||||||
|
this.syncGO(user);
|
||||||
return userMapper.updateUser(user) > 0;
|
return userMapper.updateUser(user) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步用户基本信息
|
||||||
|
*
|
||||||
|
* @param user 用户信息
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean syncGO(SysUser user){
|
||||||
|
RestTemplate restTemplate = new RestTemplate();
|
||||||
|
String url = goHost + "/api/v2/mini/user/zkSyncUser/"+accessKey;
|
||||||
|
SyncGoUser syncGoUser = new SyncGoUser();
|
||||||
|
syncGoUser.setUserId(Math.toIntExact(user.getUserId()));
|
||||||
|
syncGoUser.setNickname(user.getNickName());
|
||||||
|
syncGoUser.setUsername(user.getUserName());
|
||||||
|
syncGoUser.setMobile(user.getPhonenumber());
|
||||||
|
syncGoUser.setLastIp(user.getLoginIp());
|
||||||
|
syncGoUser.setRemark(user.getRemark());
|
||||||
|
syncGoUser.setAvatar(user.getAvatar());
|
||||||
|
syncGoUser.setStatus(Objects.equals(user.getStatus(), "正常") ?0:1);
|
||||||
|
ResponseEntity<String> response = restTemplate.postForEntity(url, syncGoUser, String.class);
|
||||||
|
// 检查响应状态码
|
||||||
|
if (response.getStatusCode().is2xxSuccessful()) {
|
||||||
|
System.out.println("响应内容:" + response.getBody());
|
||||||
|
} else {
|
||||||
|
System.out.println("请求失败,状态码:" + response.getStatusCode());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改用户头像
|
* 修改用户头像
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,9 @@ open class InnerSysUserController : BaseController() {
|
||||||
originUser.avatar = targetUser.avatar ?: originUser.avatar
|
originUser.avatar = targetUser.avatar ?: originUser.avatar
|
||||||
originUser.sex = targetUser.sex ?: originUser.sex
|
originUser.sex = targetUser.sex ?: originUser.sex
|
||||||
originUser.updateBy = originUser.userName
|
originUser.updateBy = originUser.userName
|
||||||
|
if (loginUser.sysUser.sysUserAccount != null){
|
||||||
originUser.sysUserAccount = loginUser.sysUser.sysUserAccount.apply { this.userId = originUser.userId }
|
originUser.sysUserAccount = loginUser.sysUser.sysUserAccount.apply { this.userId = originUser.userId }
|
||||||
|
}
|
||||||
userService.updateUser(originUser)
|
userService.updateUser(originUser)
|
||||||
// 更新缓存用户信息
|
// 更新缓存用户信息
|
||||||
tokenService.setLoginUser(loginUser)
|
tokenService.setLoginUser(loginUser)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue