fix: 用户被禁用、店铺被禁用、管理员被禁用,token未被清除问题处理。

This commit is contained in:
Chopper711
2023-04-19 12:08:47 +08:00
parent 1f21d80dc0
commit 7b6a150bd2
13 changed files with 122 additions and 27 deletions

View File

@@ -555,4 +555,16 @@ public enum CachePrefix {
public String getPrefix(UserEnums user) {
return "{" + this.name() + "_" + user.name() + "}_";
}
/**
* 获取缓存key值 + 用户端 +自定义前缀
* 例如三端都有用户体系需要分别登录如果用户名一致则redis中的权限可能会冲突出错
*
* @param user 角色
* @param customPrefix 自定义前缀
* @return 缓存key值
*/
public String getPrefix(UserEnums user, String customPrefix) {
return "{" + this.name() + "_" + user.name() + "}_" + customPrefix + "_";
}
}

View File

@@ -65,7 +65,7 @@ public class UserContext {
AuthUser authUser = getAuthUser(accessToken);
assert authUser != null;
if (!cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole()) + accessToken)) {
if (!cache.hasKey(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + accessToken)) {
throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR);
}
return authUser;

View File

@@ -42,13 +42,13 @@ public class TokenUtil {
//访问token
String accessToken = createToken(authUser, tokenProperties.getTokenExpireTime());
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole()) + accessToken, 1,
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + accessToken, 1,
tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
//刷新token生成策略如果是长时间有效的token用于app则默认15天有效期刷新token。如果是普通用户登录则刷新token为普通token2倍数
Long expireTime = authUser.getLongTerm() ? 15 * 24 * 60L : tokenProperties.getTokenExpireTime() * 2;
String refreshToken = createToken(authUser, expireTime);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(authUser.getRole()) + refreshToken, 1, expireTime, TimeUnit.MINUTES);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(authUser.getRole(), authUser.getId()) + refreshToken, 1, expireTime, TimeUnit.MINUTES);
token.setAccessToken(accessToken);
token.setRefreshToken(refreshToken);
@@ -85,11 +85,12 @@ public class TokenUtil {
//如果缓存中有刷新token &&
if (cache.hasKey(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + oldRefreshToken)) {
if (cache.hasKey(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) + oldRefreshToken)) {
Token token = new Token();
//访问token
String accessToken = createToken(authUser, tokenProperties.getTokenExpireTime());
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + accessToken, 1, tokenProperties.getTokenExpireTime(), TimeUnit.MINUTES);
cache.put(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums, authUser.getId()) + accessToken, 1, tokenProperties.getTokenExpireTime(),
TimeUnit.MINUTES);
//如果是信任登录设备则刷新token长度继续延长
Long expirationTime = tokenProperties.getTokenExpireTime() * 2;
@@ -101,10 +102,10 @@ public class TokenUtil {
//刷新token生成策略如果是长时间有效的token用于app则默认15天有效期刷新token。如果是普通用户登录则刷新token为普通token2倍数
String refreshToken = createToken(authUser, expirationTime);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + refreshToken, 1, expirationTime, TimeUnit.MINUTES);
cache.put(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) + refreshToken, 1, expirationTime, TimeUnit.MINUTES);
token.setAccessToken(accessToken);
token.setRefreshToken(refreshToken);
cache.remove(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums) + oldRefreshToken);
cache.remove(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) + oldRefreshToken);
return token;
} else {
throw new ServiceException(ResultCode.USER_AUTH_EXPIRED);

View File

@@ -11,11 +11,10 @@ import cn.lili.modules.member.entity.dto.MemberAddDTO;
import cn.lili.modules.member.entity.dto.MemberEditDTO;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.entity.vo.QRLoginResultVo;
import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo;
import cn.lili.modules.member.entity.vo.QRLoginResultVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.elasticsearch.monitor.os.OsStats;
import java.util.List;
import java.util.Map;
@@ -260,6 +259,13 @@ public interface MemberService extends IService<Member> {
*/
void logout(UserEnums userEnums);
/**
* 登出
*
* @param userId 用户id
*/
void logout(String userId);
/**
* 修改会员是否拥有店铺
*

View File

@@ -19,7 +19,6 @@ import cn.lili.common.security.token.Token;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.common.utils.*;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.config.ConnectAuthEnum;
import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.service.ConnectService;
@@ -309,7 +308,8 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
this.save(member);
// 发送会员注册信息
applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("new member register", rocketmqCustomProperties.getMemberTopic(), MemberTagsEnum.MEMBER_REGISTER.name(), member));
applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("new member register", rocketmqCustomProperties.getMemberTopic(),
MemberTagsEnum.MEMBER_REGISTER.name(), member));
}
@Override
@@ -456,7 +456,8 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
checkMember(memberAddDTO.getUsername(), memberAddDTO.getMobile());
//添加会员
Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), memberAddDTO.getMobile());
Member member = new Member(memberAddDTO.getUsername(), new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()),
memberAddDTO.getMobile());
registerHandler(member);
return member;
}
@@ -525,7 +526,8 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
memberPointMessage.setPoint(point);
memberPointMessage.setType(type);
memberPointMessage.setMemberId(memberId);
applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("update member point", rocketmqCustomProperties.getMemberTopic(), MemberTagsEnum.MEMBER_POINT_CHANGE.name(), memberPointMessage));
applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("update member point",
rocketmqCustomProperties.getMemberTopic(), MemberTagsEnum.MEMBER_POINT_CHANGE.name(), memberPointMessage));
return true;
}
return false;
@@ -540,6 +542,10 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
updateWrapper.set("disabled", status);
updateWrapper.in("id", memberIds);
//如果是禁用
if (Boolean.FALSE.equals(status)) {
disableMemberLogout(memberIds);
}
return this.update(updateWrapper);
}
@@ -680,8 +686,33 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> impleme
@Override
public void logout(UserEnums userEnums) {
String currentUserToken = UserContext.getCurrentUserToken();
AuthUser authUser = UserContext.getAuthUser(currentUserToken);
if (CharSequenceUtil.isNotEmpty(currentUserToken)) {
cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + currentUserToken);
cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums, authUser.getId()) + currentUserToken);
cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()) );
}
}
@Override
public void logout(String userId) {
cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MANAGER, userId));
cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MANAGER, userId));
}
/**
* 禁用会员会员token删除
*
* @param memberIds 会员id
*/
public void disableMemberLogout(List<String> memberIds) {
if (memberIds != null) {
memberIds.forEach(memberId -> {
cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER, memberId));
cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MEMBER, memberId));
});
}
}

View File

@@ -107,4 +107,11 @@ public interface AdminUserService extends IService<AdminUser> {
*/
void logout(UserEnums userEnums);
/**
* 登出
*
* @param adminUserIds 用户id
*/
void logout(List<String> adminUserIds);
}

View File

@@ -142,11 +142,24 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Override
public void logout(UserEnums userEnums) {
String currentUserToken = UserContext.getCurrentUserToken();
AuthUser authUser = UserContext.getAuthUser(currentUserToken);
if (CharSequenceUtil.isNotEmpty(currentUserToken)) {
cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + currentUserToken);
cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums, authUser.getId()) + currentUserToken);
cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(userEnums, authUser.getId()));
}
}
@Override
public void logout(List<String> adminUserIds) {
if (adminUserIds == null || adminUserIds.isEmpty()) {
return;
}
adminUserIds.forEach(adminUserId -> {
cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MANAGER, adminUserId));
cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MANAGER, adminUserId));
});
}
@Override
public AdminUser findByUsername(String username) {
@@ -234,6 +247,8 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
QueryWrapper<UserRole> queryWrapper = new QueryWrapper<>();
queryWrapper.in("user_id", ids);
userRoleService.remove(queryWrapper);
this.logout(ids);
}
/**

View File

@@ -9,6 +9,7 @@ import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.BeanUtil;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.dos.GoodsSku;
@@ -227,7 +228,7 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
} else {
store.setStoreDisable(StoreStatusEnum.REFUSED.value());
}
cache.remove(CachePrefix.STORE.getPrefix()+store.getId());
cache.remove(CachePrefix.STORE.getPrefix() + store.getId());
return this.updateById(store);
}
@@ -244,6 +245,13 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
if (update) {
goodsService.underStoreGoods(id);
}
//删除店员token
clerkService.list(new LambdaQueryWrapper<Clerk>().eq(Clerk::getStoreId, id)).forEach(clerk -> {
cache.vagueDel(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.STORE, clerk.getMemberId()));
cache.vagueDel(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.STORE, clerk.getMemberId()));
});
return update;
}
@@ -371,7 +379,8 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
clerkService.remove(new LambdaQueryWrapper<Clerk>().eq(Clerk::getShopkeeper, true));
List<Clerk> clerkList = new ArrayList<>();
//遍历已开启的店铺
for (Store store : this.list(new LambdaQueryWrapper<Store>().eq(Store::getDeleteFlag, false).eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()))) {
for (Store store : this.list(new LambdaQueryWrapper<Store>().eq(Store::getDeleteFlag, false).eq(Store::getStoreDisable,
StoreStatusEnum.OPEN.name()))) {
clerkList.add(new Clerk(store));
}
clerkService.saveBatch(clerkList);
@@ -381,7 +390,8 @@ public class StoreServiceImpl extends ServiceImpl<StoreMapper, Store> implements
public List<GoodsSku> getToMemberHistory(String memberId) {
AuthUser currentUser = UserContext.getCurrentUser();
List<String> skuIdList = new ArrayList<>();
for (FootPrint footPrint : footprintService.list(new LambdaUpdateWrapper<FootPrint>().eq(FootPrint::getStoreId, currentUser.getStoreId()).eq(FootPrint::getMemberId, memberId))) {
for (FootPrint footPrint :
footprintService.list(new LambdaUpdateWrapper<FootPrint>().eq(FootPrint::getStoreId, currentUser.getStoreId()).eq(FootPrint::getMemberId, memberId))) {
if (footPrint.getSkuId() != null) {
skuIdList.add(footPrint.getSkuId());
}