session动态更新

This commit is contained in:
lyd
2022-09-23 10:27:18 +08:00
parent 8eaf18b3bd
commit 4fe14aeddd
5 changed files with 106 additions and 81 deletions

View File

@@ -0,0 +1,42 @@
package org.nl.modules.security.satoken.utils;
import cn.dev33.satoken.stp.StpUtil;
import lombok.RequiredArgsConstructor;
import org.nl.modules.system.domain.User;
import org.nl.modules.system.service.RoleService;
import org.nl.modules.system.service.UserService;
import org.nl.modules.system.service.dto.UserDto;
import org.nl.utils.dto.CurrentUser;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author: lyd
* @description: 当用户信息改变时候需要刷新session
* @Date: 2022/9/23
*/
@Component
@RequiredArgsConstructor
public class FlushSessionUtil {
private final UserService userService;
private final RoleService roleService;
/**
* 更新session数据 - Session TokenSession
* @param user
*/
public void flushSessionInfo(User user) {
UserDto userDto = userService.findByName(user.getUsername());
List<String> permissionList = roleService.getPermissionList(userDto.getId().toString());
StpUtil.getSession().set("UserDto", userDto);
// 获取权限列表 - 登录查找权限
CurrentUser user2 = new CurrentUser();
user2.setId(userDto.getId());
user2.setUsername(userDto.getUsername());
user2.setUser(userDto);
user2.setPermissions(permissionList);
StpUtil.getTokenSession().set("userInfo", user);
}
}

View File

@@ -106,7 +106,6 @@ public class OnlineUserService {
* @param key /
*/
public void kickOut(String key){
// key = properties.getOnlineKey() + key;
redisUtils.del(key);
}
@@ -115,7 +114,6 @@ public class OnlineUserService {
* @param token /
*/
public void logout(String token) {
// String key = properties.getOnlineKey() + token;
redisUtils.del(token);
}

View File

@@ -1,49 +1,49 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.nl.modules.security.service;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;
/**
* @author: liaojinlong
* @date: 2020/6/11 18:01
* @apiNote: 用于清理 用户登录信息缓存为防止Spring循环依赖与安全考虑 ,单独构成工具类
*/
@Component
public class UserCacheClean {
/**
* 清理特定用户缓存信息<br>
* 用户信息变更时
*
* @param userName /
*/
public void cleanUserCache(String userName) {
if (StrUtil.isNotEmpty(userName)) {
// UserDetailsServiceImpl.userDtoCache.remove(userName);
}
}
/**
* 清理所有用户的缓存信息<br>
* ,如发生角色授权信息变化,可以简便的全部失效缓存
*/
// public void cleanAll() {
// UserDetailsServiceImpl.userDtoCache.clear();
///*
// * Copyright 2019-2020 the original author or authors.
// *
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// *
// * http://www.apache.org/licenses/LICENSE-2.0
// *
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// */
//
//package org.nl.modules.security.service;
//
//import cn.hutool.core.util.StrUtil;
//import org.springframework.stereotype.Component;
//
///**
// * @author: liaojinlong
// * @date: 2020/6/11 18:01
// * @apiNote: 用于清理 用户登录信息缓存为防止Spring循环依赖与安全考虑 ,单独构成工具类
// */
//@Component
//public class UserCacheClean {
//
// /**
// * 清理特定用户缓存信息<br>
// * 用户信息变更时
// *
// * @param userName /
// */
// public void cleanUserCache(String userName) {
// if (StrUtil.isNotEmpty(userName)) {
//// UserDetailsServiceImpl.userDtoCache.remove(userName);
// }
// }
}
//
// /**
// * 清理所有用户的缓存信息<br>
// * ,如发生角色授权信息变化,可以简便的全部失效缓存
// */
//// public void cleanAll() {
//// UserDetailsServiceImpl.userDtoCache.clear();
//// }
//}

View File

@@ -22,7 +22,6 @@ import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.nl.exception.BadRequestException;
import org.nl.exception.EntityExistException;
import org.nl.modules.security.service.UserCacheClean;
import org.nl.modules.system.domain.Role;
import org.nl.modules.system.domain.User;
import org.nl.modules.system.repository.RoleRepository;
@@ -63,7 +62,7 @@ public class RoleServiceImpl implements RoleService {
private final RoleSmallMapper roleSmallMapper;
private final RedisUtils redisUtils;
private final UserRepository userRepository;
private final UserCacheClean userCacheClean;
// private final UserCacheClean userCacheClean;
@Override
public List<RoleDto> queryAll() {
@@ -162,25 +161,6 @@ public class RoleServiceImpl implements RoleService {
return Collections.min(roleDtos.stream().map(RoleDto::getLevel).collect(Collectors.toList()));
}
// @Override
// @Cacheable(key = "'auth:' + #p0.id")
// public List<String> mapToGrantedAuthorities(UserDto user) {
// Set<String> permissions = new HashSet<>();
// // 如果是管理员直接返回
// if (user.getIsAdmin()) {
// permissions.add("admin");
//// return permissions.stream().map(SimpleGrantedAuthority::new)
//// .collect(Collectors.toList());
// }
// Set<Role> roles = roleRepository.findByUserId(user.getId());
// permissions = roles.stream().flatMap(role -> role.getMenus().stream())
// .filter(menu -> StrUtil.isNotEmpty(menu.getPermission()))
// .map(Menu::getPermission).collect(Collectors.toSet());
//// return permissions.stream().map(SimpleGrantedAuthority::new)
//// .collect(Collectors.toList());
// return null;
// }
@Override
@Cacheable(key = "'auth:' + #p0")
public List<String> getPermissionList(String id) {
@@ -234,7 +214,7 @@ public class RoleServiceImpl implements RoleService {
public void delCaches(Long id, List<User> users) {
users = CollectionUtil.isEmpty(users) ? userRepository.findByRoleId(id) : users;
if (CollectionUtil.isNotEmpty(users)) {
users.forEach(item -> userCacheClean.cleanUserCache(item.getUsername()));
// users.forEach(item -> userCacheClean.cleanUserCache(item.getUsername()));
Set<Long> userIds = users.stream().map(User::getId).collect(Collectors.toSet());
redisUtils.delByKeys(CacheKey.DATA_USER, userIds);
redisUtils.delByKeys(CacheKey.MENU_USER, userIds);

View File

@@ -20,8 +20,8 @@ import lombok.RequiredArgsConstructor;
import org.nl.config.FileProperties;
import org.nl.exception.EntityExistException;
import org.nl.exception.EntityNotFoundException;
import org.nl.modules.security.satoken.utils.FlushSessionUtil;
import org.nl.modules.security.service.OnlineUserService;
import org.nl.modules.security.service.UserCacheClean;
import org.nl.modules.system.domain.User;
import org.nl.modules.system.repository.UserRepository;
import org.nl.modules.system.service.UserService;
@@ -59,8 +59,9 @@ public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
private final FileProperties properties;
private final RedisUtils redisUtils;
private final UserCacheClean userCacheClean;
private final OnlineUserService onlineUserService;
private final FlushSessionUtil flushSessionUtil;
@Override
public Object queryAll(UserQueryCriteria criteria, Pageable pageable) {
@@ -137,6 +138,8 @@ public class UserServiceImpl implements UserService {
userRepository.save(user);
// 清除缓存
delCaches(user.getId(), user.getUsername());
// 修改session
flushSession(user);
}
@Override
@@ -149,6 +152,8 @@ public class UserServiceImpl implements UserService {
userRepository.save(user);
// 清理缓存
delCaches(user.getId(), user.getUsername());
// 修改session
flushSession(user);
}
@Override
@@ -178,7 +183,7 @@ public class UserServiceImpl implements UserService {
public void updatePass(String username, String pass) {
userRepository.updatePass(username, pass, new Date());
redisUtils.del("user::username:" + username);
flushCache(username);
flushSession(userRepository.findByUsername(username));
}
@Override
@@ -194,7 +199,7 @@ public class UserServiceImpl implements UserService {
FileUtil.del(oldPath);
}
@NotBlank String username = user.getUsername();
flushCache(username);
flushSession(user);
return new HashMap<String, String>(1) {{
put("avatar", file.getName());
}};
@@ -204,7 +209,7 @@ public class UserServiceImpl implements UserService {
@Transactional(rollbackFor = Exception.class)
public void updateEmail(String username, String email) {
userRepository.updateEmail(username, email);
flushCache(username);
flushSession(userRepository.findByUsername(username));
}
@Override
@@ -234,15 +239,15 @@ public class UserServiceImpl implements UserService {
*/
public void delCaches(Long id, String username) {
redisUtils.del(CacheKey.USER_ID + id);
flushCache(username);
// flushCache(username);
}
/**
* 清理 登陆时 用户缓存信息
*
* @param username /
* @param user /
*/
private void flushCache(String username) {
userCacheClean.cleanUserCache(username);
private void flushSession(User user) {
flushSessionUtil.flushSessionInfo(user);
}
}