@@ -19,6 +19,7 @@ import com.ningdatech.pmapi.sys.model.dto.RoleUpdateDTO; | |||||
import com.ningdatech.pmapi.sys.model.entity.*; | import com.ningdatech.pmapi.sys.model.entity.*; | ||||
import com.ningdatech.pmapi.sys.service.*; | import com.ningdatech.pmapi.sys.service.*; | ||||
import com.ningdatech.pmapi.sys.utils.AuthCacheKeyUtils; | import com.ningdatech.pmapi.sys.utils.AuthCacheKeyUtils; | ||||
import com.ningdatech.pmapi.user.manage.UserAuthLoginManage; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
@@ -46,6 +47,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR | |||||
private final CachePlusOps cachePlusOps; | private final CachePlusOps cachePlusOps; | ||||
private final IRoleMenuService roleMenuService; | private final IRoleMenuService roleMenuService; | ||||
private final IMenuService menuService; | private final IMenuService menuService; | ||||
private final UserAuthLoginManage userAuthLoginManage; | |||||
/** | /** | ||||
* 删除角色时,需要级联删除跟角色相关的一切资源: | * 删除角色时,需要级联删除跟角色相关的一切资源: | ||||
@@ -155,7 +157,10 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IR | |||||
saveRoleMenu(data.getMenuIds(), role.getId()); | saveRoleMenu(data.getMenuIds(), role.getId()); | ||||
saveRoleMenuDatascope(data.getMenuDataScopeList(), role.getId()); | saveRoleMenuDatascope(data.getMenuDataScopeList(), role.getId()); | ||||
List<Long> userIdList = userRoleService.listUserIdByRoleId(role.getId()); | List<Long> userIdList = userRoleService.listUserIdByRoleId(role.getId()); | ||||
userIdList.forEach(w -> cachePlusOps.del(AuthCacheKeyUtils.userResourceCacheKey(w))); | |||||
userIdList.forEach(w -> { | |||||
cachePlusOps.del(AuthCacheKeyUtils.userResourceCacheKey(w)); | |||||
userAuthLoginManage.refreshSession(w); | |||||
}); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -3,6 +3,7 @@ package com.ningdatech.pmapi.user.manage; | |||||
import cn.hutool.core.collection.CollectionUtil; | import cn.hutool.core.collection.CollectionUtil; | ||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | import com.baomidou.mybatisplus.core.toolkit.StringUtils; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.pmapi.common.util.StrUtils; | |||||
import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo; | import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo; | ||||
import com.ningdatech.pmapi.organization.model.entity.DingOrganization; | import com.ningdatech.pmapi.organization.model.entity.DingOrganization; | ||||
import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService; | import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService; | ||||
@@ -11,11 +12,17 @@ import com.ningdatech.pmapi.sys.model.entity.Role; | |||||
import com.ningdatech.pmapi.sys.model.entity.UserRole; | import com.ningdatech.pmapi.sys.model.entity.UserRole; | ||||
import com.ningdatech.pmapi.sys.service.IRoleService; | import com.ningdatech.pmapi.sys.service.IRoleService; | ||||
import com.ningdatech.pmapi.sys.service.IUserRoleService; | import com.ningdatech.pmapi.sys.service.IUserRoleService; | ||||
import com.ningdatech.pmapi.user.convert.UserInfoConvertor; | |||||
import com.ningdatech.pmapi.user.entity.UserInfo; | import com.ningdatech.pmapi.user.entity.UserInfo; | ||||
import com.ningdatech.pmapi.user.security.auth.credential.CredentialAuthToken; | |||||
import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO; | import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO; | ||||
import com.ningdatech.pmapi.user.service.IUserAuthService; | |||||
import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | |||||
import com.ningdatech.pmapi.user.service.IUserInfoService; | import com.ningdatech.pmapi.user.service.IUserInfoService; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.springframework.security.core.context.SecurityContextImpl; | |||||
import org.springframework.session.Session; | |||||
import org.springframework.session.SessionRepository; | |||||
import org.springframework.session.data.redis.RedisIndexedSessionRepository; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
@@ -32,13 +39,12 @@ import java.util.stream.Collectors; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class UserAuthLoginManage { | public class UserAuthLoginManage { | ||||
private final IUserAuthService iUserAuthService; | |||||
private final IUserInfoService iUserInfoService; | private final IUserInfoService iUserInfoService; | ||||
private final IRoleService iRoleService; | private final IRoleService iRoleService; | ||||
private final IDingOrganizationService iDingOrganizationService; | private final IDingOrganizationService iDingOrganizationService; | ||||
private final IDingEmployeeInfoService iDingEmployeeInfoService; | private final IDingEmployeeInfoService iDingEmployeeInfoService; | ||||
private final IUserRoleService iUserRoleService; | private final IUserRoleService iUserRoleService; | ||||
private final RedisIndexedSessionRepository redisIndexedSessionRepository; | |||||
/** | /** | ||||
* 根据用户id 获取用户全量信息 | * 根据用户id 获取用户全量信息 | ||||
@@ -186,4 +192,47 @@ public class UserAuthLoginManage { | |||||
userFullInfoAssembler(userInfo, userFullInfoDTO); | userFullInfoAssembler(userInfo, userFullInfoDTO); | ||||
return userFullInfoDTO; | return userFullInfoDTO; | ||||
} | } | ||||
@SuppressWarnings({"rawtypes", "unchecked"}) | |||||
public void refreshSession(Long userId) { | |||||
UserFullInfoDTO userFullInfo = getUserFullInfo(userId); | |||||
List<String> sessionIds = getSessionIds(userFullInfo); | |||||
if (sessionIds.isEmpty()) { | |||||
return; | |||||
} | |||||
SessionRepository redisSessionRepository = redisIndexedSessionRepository; | |||||
UserInfoDetails details = UserInfoConvertor.toUserInfoDetails(userFullInfo); | |||||
CredentialAuthToken cat = new CredentialAuthToken(details, details.getPassword(), details.getAuthorities()); | |||||
sessionIds.forEach(sessionId -> { | |||||
Session session = redisIndexedSessionRepository.findById(sessionId); | |||||
SecurityContextImpl context = session.getAttribute("SPRING_SECURITY_CONTEXT"); | |||||
context.setAuthentication(cat); | |||||
session.setAttribute("SPRING_SECURITY_CONTEXT", context); | |||||
redisSessionRepository.save(session); | |||||
}); | |||||
} | |||||
private List<String> getSessionIds(UserFullInfoDTO userFullInfo) { | |||||
List<String> sessionIds = new ArrayList<>(); | |||||
String identifier = userFullInfo.getIdentifier(); | |||||
if (StrUtils.isNotBlank(identifier)) { | |||||
sessionIds.addAll(redisIndexedSessionRepository.findByPrincipalName(identifier).keySet()); | |||||
} | |||||
String mobile = userFullInfo.getMobile(); | |||||
if (StrUtils.isNotBlank(mobile)) { | |||||
sessionIds.addAll(redisIndexedSessionRepository.findByPrincipalName(mobile).keySet()); | |||||
} | |||||
Long accountId = userFullInfo.getAccountId(); | |||||
if (accountId != null) { | |||||
sessionIds.addAll(redisIndexedSessionRepository.findByPrincipalName(accountId.toString()).keySet()); | |||||
} | |||||
return sessionIds; | |||||
} | |||||
public void kickOff(Long userId) { | |||||
UserFullInfoDTO userFullInfo = getUserFullInfo(userId); | |||||
List<String> sessionIds = getSessionIds(userFullInfo); | |||||
sessionIds.forEach(redisIndexedSessionRepository::deleteById); | |||||
} | |||||
} | } |
@@ -10,7 +10,6 @@ import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.pmapi.common.constant.RegionConst; | import com.ningdatech.pmapi.common.constant.RegionConst; | ||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | ||||
import com.ningdatech.pmapi.common.helper.UserInfoHelper; | import com.ningdatech.pmapi.common.helper.UserInfoHelper; | ||||
import com.ningdatech.pmapi.common.util.BizUtils; | |||||
import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo; | import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo; | ||||
import com.ningdatech.pmapi.organization.model.entity.DingOrganization; | import com.ningdatech.pmapi.organization.model.entity.DingOrganization; | ||||
import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService; | import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService; | ||||
@@ -20,7 +19,6 @@ import com.ningdatech.pmapi.sys.model.entity.UserRole; | |||||
import com.ningdatech.pmapi.sys.service.IRoleService; | import com.ningdatech.pmapi.sys.service.IRoleService; | ||||
import com.ningdatech.pmapi.sys.service.IUserRoleService; | import com.ningdatech.pmapi.sys.service.IUserRoleService; | ||||
import com.ningdatech.pmapi.user.constant.UserAvailableEnum; | import com.ningdatech.pmapi.user.constant.UserAvailableEnum; | ||||
import com.ningdatech.pmapi.user.convert.UserInfoConvertor; | |||||
import com.ningdatech.pmapi.user.entity.UserInfo; | import com.ningdatech.pmapi.user.entity.UserInfo; | ||||
import com.ningdatech.pmapi.user.model.po.ReqUserDetailEditPO; | import com.ningdatech.pmapi.user.model.po.ReqUserDetailEditPO; | ||||
import com.ningdatech.pmapi.user.model.po.ReqUserDetailPO; | import com.ningdatech.pmapi.user.model.po.ReqUserDetailPO; | ||||
@@ -29,17 +27,11 @@ import com.ningdatech.pmapi.user.model.po.ReqUserInfoListPO; | |||||
import com.ningdatech.pmapi.user.model.vo.ResUserDetailVO; | import com.ningdatech.pmapi.user.model.vo.ResUserDetailVO; | ||||
import com.ningdatech.pmapi.user.model.vo.ResUserInfoListVO; | import com.ningdatech.pmapi.user.model.vo.ResUserInfoListVO; | ||||
import com.ningdatech.pmapi.user.model.vo.UserRoleVO; | import com.ningdatech.pmapi.user.model.vo.UserRoleVO; | ||||
import com.ningdatech.pmapi.user.security.auth.credential.CredentialAuthToken; | |||||
import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO; | import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO; | ||||
import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | |||||
import com.ningdatech.pmapi.user.service.IUserInfoService; | import com.ningdatech.pmapi.user.service.IUserInfoService; | ||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | import com.ningdatech.pmapi.user.util.LoginUserUtil; | ||||
import com.wflow.workflow.bean.dto.ProcessInstanceUserDto; | import com.wflow.workflow.bean.dto.ProcessInstanceUserDto; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.springframework.security.core.context.SecurityContextImpl; | |||||
import org.springframework.session.Session; | |||||
import org.springframework.session.SessionRepository; | |||||
import org.springframework.session.data.redis.RedisIndexedSessionRepository; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
@@ -61,7 +53,6 @@ public class UserInfoManage { | |||||
private final IUserRoleService iUserRoleService; | private final IUserRoleService iUserRoleService; | ||||
private final IRoleService iRoleService; | private final IRoleService iRoleService; | ||||
private final UserInfoHelper userInfoHelper; | private final UserInfoHelper userInfoHelper; | ||||
private final RedisIndexedSessionRepository redisIndexedSessionRepository; | |||||
private final RegionCacheHelper regionCacheHelper; | private final RegionCacheHelper regionCacheHelper; | ||||
private final UserAuthLoginManage userAuthLoginManage; | private final UserAuthLoginManage userAuthLoginManage; | ||||
@@ -268,6 +259,10 @@ public class UserInfoManage { | |||||
UserInfo userInfo = iUserInfoService.getById(userId); | UserInfo userInfo = iUserInfoService.getById(userId); | ||||
userInfo.setAvailable(reqUserDisableOrEnablePO.getOperation()); | userInfo.setAvailable(reqUserDisableOrEnablePO.getOperation()); | ||||
iUserInfoService.updateById(userInfo); | iUserInfoService.updateById(userInfo); | ||||
if (userInfo.getAvailable().equals("DISABLE")) { | |||||
userAuthLoginManage.kickOff(userId); | |||||
} | |||||
} | } | ||||
public ResUserDetailVO userInfoDetail(ReqUserDetailPO reqUserDetailPO) { | public ResUserDetailVO userInfoDetail(ReqUserDetailPO reqUserDetailPO) { | ||||
@@ -341,7 +336,7 @@ public class UserInfoManage { | |||||
iUserRoleService.saveBatch(userRoleList); | iUserRoleService.saveBatch(userRoleList); | ||||
} | } | ||||
// 刷新用户权限 | // 刷新用户权限 | ||||
refreshSession(userId); | |||||
userAuthLoginManage.refreshSession(userId); | |||||
} | } | ||||
/** | /** | ||||
@@ -502,25 +497,4 @@ public class UserInfoManage { | |||||
return processInstanceUserDto; | return processInstanceUserDto; | ||||
} | } | ||||
public void refreshSession(Long userId) { | |||||
UserFullInfoDTO ufi = userAuthLoginManage.getUserFullInfo(userId); | |||||
List<String> sessionIds = new ArrayList<>(); | |||||
BizUtils.notNull(ufi.getIdentifier(), w -> sessionIds.addAll(redisIndexedSessionRepository.findByPrincipalName(w).keySet())); | |||||
BizUtils.notNull(ufi.getMobile(), w -> sessionIds.addAll(redisIndexedSessionRepository.findByPrincipalName(w).keySet())); | |||||
BizUtils.notNull(ufi.getAccountId(), w -> sessionIds.addAll(redisIndexedSessionRepository.findByPrincipalName(w.toString()).keySet())); | |||||
if (sessionIds.isEmpty()) { | |||||
return; | |||||
} | |||||
SessionRepository redisSessionRepository = redisIndexedSessionRepository; | |||||
UserInfoDetails details = UserInfoConvertor.toUserInfoDetails(ufi); | |||||
CredentialAuthToken cat = new CredentialAuthToken(details, details.getPassword(), details.getAuthorities()); | |||||
sessionIds.forEach(sessionId -> { | |||||
Session session = redisIndexedSessionRepository.findById(sessionId); | |||||
SecurityContextImpl context = session.getAttribute("SPRING_SECURITY_CONTEXT"); | |||||
context.setAuthentication(cat); | |||||
session.setAttribute("SPRING_SECURITY_CONTEXT", context); | |||||
redisSessionRepository.save(session); | |||||
}); | |||||
} | |||||
} | } |