Commit c5ed5b2d by 陈健智

单账号登录限制

parent 3f8c9466
...@@ -2,11 +2,13 @@ package com.zhiwei.brandkbs2.auth; ...@@ -2,11 +2,13 @@ package com.zhiwei.brandkbs2.auth;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.zhiwei.brandkbs2.common.GenericAttribute; import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
import com.zhiwei.brandkbs2.enmus.RoleEnum; import com.zhiwei.brandkbs2.enmus.RoleEnum;
import com.zhiwei.brandkbs2.model.CommonCodeEnum; import com.zhiwei.brandkbs2.model.CommonCodeEnum;
import com.zhiwei.brandkbs2.model.ResponseResult; import com.zhiwei.brandkbs2.model.ResponseResult;
import com.zhiwei.brandkbs2.pojo.UserInfo; import com.zhiwei.brandkbs2.pojo.UserInfo;
import com.zhiwei.brandkbs2.service.UserService; import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.brandkbs2.util.RedisUtil;
import com.zhiwei.brandkbs2.util.Tools; import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.util.JwtUtil; import com.zhiwei.middleware.auth.util.JwtUtil;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
...@@ -17,6 +19,7 @@ import org.aspectj.lang.annotation.Around; ...@@ -17,6 +19,7 @@ import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -26,10 +29,13 @@ import org.springframework.web.context.request.ServletRequestAttributes; ...@@ -26,10 +29,13 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/** /**
* @author sjj * @author sjj
...@@ -49,6 +55,9 @@ public class AuthAspect { ...@@ -49,6 +55,9 @@ public class AuthAspect {
@Resource(name = "userServiceImpl") @Resource(name = "userServiceImpl")
private UserService UserService; private UserService UserService;
@Autowired
private RedisUtil redisUtil;
@Pointcut("execution(com.zhiwei.brandkbs2.model.ResponseResult com.zhiwei.brandkbs2.controller..*.*(..))") @Pointcut("execution(com.zhiwei.brandkbs2.model.ResponseResult com.zhiwei.brandkbs2.controller..*.*(..))")
// @Pointcut("within(com.zhiwei.brandkbs2.controller..*)") // @Pointcut("within(com.zhiwei.brandkbs2.controller..*)")
public void auth() { public void auth() {
...@@ -82,6 +91,10 @@ public class AuthAspect { ...@@ -82,6 +91,10 @@ public class AuthAspect {
log.error("token解析异常,uri:{},methodName:{},token:{}", uri, methodName, token); log.error("token解析异常,uri:{},methodName:{},token:{}", uri, methodName, token);
} else { } else {
String uid = tokenInfo.get(GenericAttribute.USER_ID).toString(); String uid = tokenInfo.get(GenericAttribute.USER_ID).toString();
// session单账号登录限制校验
if (!checkSession(request, uid)){
return joinPoint.proceed();
}
UserInfo userInfo = UserService.queryUserInfo(uid, request.getHeader("pid")); UserInfo userInfo = UserService.queryUserInfo(uid, request.getHeader("pid"));
if (null == userInfo) { if (null == userInfo) {
userInfo = new UserInfo().setUserId(uid).setProjectId(request.getHeader("pid")); userInfo = new UserInfo().setUserId(uid).setProjectId(request.getHeader("pid"));
...@@ -100,6 +113,21 @@ public class AuthAspect { ...@@ -100,6 +113,21 @@ public class AuthAspect {
return joinPoint.proceed(); return joinPoint.proceed();
} }
private Boolean checkSession(HttpServletRequest request, String uid) {
// 小程序端不限制
if (request.getRequestURI().contains("/brandkbs/mobile/")){
return true;
}
HttpSession session = request.getSession();
String sessionId = session.getId();
String cacheSessionId = redisUtil.get(RedisKeyPrefix.userSessionKey(uid));
if (null == cacheSessionId) {
redisUtil.setExpire(RedisKeyPrefix.userSessionKey(uid), sessionId, 7, TimeUnit.DAYS);
}
// 已登录状态
return null == cacheSessionId || Objects.equals(sessionId, cacheSessionId);
}
// @Around("auth()") // @Around("auth()")
public Object aroundCheckToken(ProceedingJoinPoint joinPoint) throws Throwable { public Object aroundCheckToken(ProceedingJoinPoint joinPoint) throws Throwable {
Signature signature = joinPoint.getSignature(); Signature signature = joinPoint.getSignature();
......
...@@ -128,6 +128,8 @@ public class RedisKeyPrefix { ...@@ -128,6 +128,8 @@ public class RedisKeyPrefix {
public static final String AI_SEARCH_QUESTION = "BRANDKBS:AI:SEARCH:QUESTION:"; public static final String AI_SEARCH_QUESTION = "BRANDKBS:AI:SEARCH:QUESTION:";
public static final String USER_SESSION = "BRANDKBS:USER:SESSION:";
public static String projectWarnHotTopKeyAll(String projectId, String type) { public static String projectWarnHotTopKeyAll(String projectId, String type) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.PROJECT_WARN_HOT_TOP, projectId, Tools.concat(type, "*")); return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.PROJECT_WARN_HOT_TOP, projectId, Tools.concat(type, "*"));
} }
...@@ -168,6 +170,10 @@ public class RedisKeyPrefix { ...@@ -168,6 +170,10 @@ public class RedisKeyPrefix {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.HOT_SUPPLEMENT_WORD, projectId); return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.HOT_SUPPLEMENT_WORD, projectId);
} }
public static String userSessionKey(String userId) {
return RedisKeyPrefix.generateRedisKey(RedisKeyPrefix.USER_SESSION, userId);
}
private static String generateRedisKey(String... keys) { private static String generateRedisKey(String... keys) {
Objects.requireNonNull(keys); Objects.requireNonNull(keys);
boolean contains = keys[0].endsWith(":"); boolean contains = keys[0].endsWith(":");
......
...@@ -3,7 +3,9 @@ package com.zhiwei.brandkbs2.service.impl; ...@@ -3,7 +3,9 @@ package com.zhiwei.brandkbs2.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.zhiwei.brandkbs2.auth.UserThreadLocal; import com.zhiwei.brandkbs2.auth.UserThreadLocal;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.brandkbs2.common.GlobalPojo; import com.zhiwei.brandkbs2.common.GlobalPojo;
import com.zhiwei.brandkbs2.common.RedisKeyPrefix;
import com.zhiwei.brandkbs2.config.Constant; import com.zhiwei.brandkbs2.config.Constant;
import com.zhiwei.brandkbs2.dao.ProjectDao; import com.zhiwei.brandkbs2.dao.ProjectDao;
import com.zhiwei.brandkbs2.dao.UserDao; import com.zhiwei.brandkbs2.dao.UserDao;
...@@ -24,8 +26,10 @@ import com.zhiwei.brandkbs2.pojo.vo.PageVO; ...@@ -24,8 +26,10 @@ import com.zhiwei.brandkbs2.pojo.vo.PageVO;
import com.zhiwei.brandkbs2.service.UserCenterService; import com.zhiwei.brandkbs2.service.UserCenterService;
import com.zhiwei.brandkbs2.service.UserService; import com.zhiwei.brandkbs2.service.UserService;
import com.zhiwei.brandkbs2.util.MongoUtil; import com.zhiwei.brandkbs2.util.MongoUtil;
import com.zhiwei.brandkbs2.util.RedisUtil;
import com.zhiwei.brandkbs2.util.Tools; import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.middleware.auth.pojo.CenterUser; import com.zhiwei.middleware.auth.pojo.CenterUser;
import com.zhiwei.middleware.auth.util.JwtUtil;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -38,9 +42,13 @@ import org.springframework.http.HttpEntity; ...@@ -38,9 +42,13 @@ import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -87,6 +95,12 @@ public class UserServiceImpl implements UserService { ...@@ -87,6 +95,12 @@ public class UserServiceImpl implements UserService {
@Autowired @Autowired
private RestTemplate restTemplate; private RestTemplate restTemplate;
@Autowired
private RedisUtil redisUtil;
@Value("${jwt.key}")
private String jwtKey;
@Override @Override
public UserInfo login() { public UserInfo login() {
String uid = UserThreadLocal.getUserId(); String uid = UserThreadLocal.getUserId();
...@@ -367,13 +381,27 @@ public class UserServiceImpl implements UserService { ...@@ -367,13 +381,27 @@ public class UserServiceImpl implements UserService {
@Override @Override
public boolean checkUserRoles() { public boolean checkUserRoles() {
User user = userDao.findOneById(UserThreadLocal.getUserId()); String uid = saveLoginUserSession();
User user = userDao.findOneById(uid);
if (null == user) { if (null == user) {
return false; return false;
} }
return user.isSuperAdmin() || !CollectionUtils.isEmpty(user.getRoles()); return user.isSuperAdmin() || !CollectionUtils.isEmpty(user.getRoles());
} }
/**
* 记录登录用户的session 用于单账号登录限制session校验
* @return
*/
private String saveLoginUserSession(){
ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
HttpServletRequest request = Objects.requireNonNull(servletRequestAttributes).getRequest();
Map<String, Object> map = JwtUtil.unsign(request.getHeader(jwtKey), Map.class);
String userId = map.get(GenericAttribute.USER_ID).toString();
redisUtil.setExpire(RedisKeyPrefix.userSessionKey(userId), request.getSession().getId(), 7, TimeUnit.DAYS);
return userId;
}
@Override @Override
public void resetBind(String username) { public void resetBind(String username) {
String uid = UserThreadLocal.getUserId(); String uid = UserThreadLocal.getUserId();
......
...@@ -16,6 +16,8 @@ brandkbs.head.url=/usr/local/sources/brandkbs2/head/ ...@@ -16,6 +16,8 @@ brandkbs.head.url=/usr/local/sources/brandkbs2/head/
brandkbs.image.url=https://brandkbs.test.zhiweidata.com/brandkbs/images/ brandkbs.image.url=https://brandkbs.test.zhiweidata.com/brandkbs/images/
#\u56FE\u7247\u8D44\u6E90\u8DEF\u5F84 #\u56FE\u7247\u8D44\u6E90\u8DEF\u5F84
cbs.imagesPath=file:${brandkbs.img.url},file:${brandkbs.head.url} cbs.imagesPath=file:${brandkbs.img.url},file:${brandkbs.head.url}
#session\u8FC7\u671F\u65F6\u95F4
server.servlet.session.timeout=604800
#redis #redis
spring.redis.host=192.168.0.39 spring.redis.host=192.168.0.39
......
...@@ -16,6 +16,8 @@ brandkbs.head.url=D:\\ExcelTest\\ ...@@ -16,6 +16,8 @@ brandkbs.head.url=D:\\ExcelTest\\
brandkbs.image.url=https://brandkbs.zhiweidata.com/brandkbs/images/ brandkbs.image.url=https://brandkbs.zhiweidata.com/brandkbs/images/
#\u56FE\u7247\u8D44\u6E90\u8DEF\u5F84 #\u56FE\u7247\u8D44\u6E90\u8DEF\u5F84
cbs.imagesPath=file:${brandkbs.img.url},file:${brandkbs.head.url} cbs.imagesPath=file:${brandkbs.img.url},file:${brandkbs.head.url}
#session\u8FC7\u671F\u65F6\u95F4
server.servlet.session.timeout=604800
#redis \u6D4B\u8BD5 #redis \u6D4B\u8BD5
spring.redis.host=192.168.0.24 spring.redis.host=192.168.0.24
......
...@@ -16,6 +16,8 @@ brandkbs.head.url=/usr/local/sources/brandkbs2/head/ ...@@ -16,6 +16,8 @@ brandkbs.head.url=/usr/local/sources/brandkbs2/head/
brandkbs.image.url=https://brandkbs.zhiweidata.com/brandkbs/images/ brandkbs.image.url=https://brandkbs.zhiweidata.com/brandkbs/images/
#\u56FE\u7247\u8D44\u6E90\u8DEF\u5F84 #\u56FE\u7247\u8D44\u6E90\u8DEF\u5F84
cbs.imagesPath=file:${brandkbs.img.url},file:${brandkbs.head.url} cbs.imagesPath=file:${brandkbs.img.url},file:${brandkbs.head.url}
#session\u8FC7\u671F\u65F6\u95F4
server.servlet.session.timeout=604800
#redis #redis
spring.redis.host=192.168.0.39 spring.redis.host=192.168.0.39
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment