From 78b7d21ddcfde50de458a16589d17c9166da37f7 Mon Sep 17 00:00:00 2001 From: Zheng Jie <201507802@qq.com> Date: Thu, 26 May 2022 15:39:59 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD](master):?= =?UTF-8?q?=20=E7=94=A8=E6=88=B7=E7=99=BB=E5=BD=95=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=AD=98=E5=82=A8=E5=88=B0=20Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/config/SpringSecurityConfig.java | 6 +- .../security/config/bean/LoginProperties.java | 10 +- .../security/security/TokenConfigurer.java | 6 +- .../security/security/TokenFilter.java | 13 +- .../security/service/UserCacheClean.java | 53 ------ .../security/service/UserCacheManager.java | 152 +++++++----------- .../service/UserDetailsServiceImpl.java | 107 ++---------- .../security/service/dto/JwtUserDto.java | 6 +- .../modules/system/service/UserService.java | 8 + .../system/service/dto/UserLoginDto.java | 28 ++++ .../system/service/impl/RoleServiceImpl.java | 6 +- .../system/service/impl/UserServiceImpl.java | 23 ++- .../service/mapstruct/UserLoginMapper.java | 30 ++++ .../main/resources/config/application-dev.yml | 6 +- .../resources/config/application-prod.yml | 6 +- .../src/main/resources/config/application.yml | 11 +- 16 files changed, 181 insertions(+), 290 deletions(-) delete mode 100644 eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserCacheClean.java create mode 100644 eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/UserLoginDto.java create mode 100644 eladmin-system/src/main/java/me/zhengjie/modules/system/service/mapstruct/UserLoginMapper.java diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java index 2c02f4e7..ad886f31 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/SpringSecurityConfig.java @@ -20,7 +20,7 @@ import me.zhengjie.annotation.AnonymousAccess; import me.zhengjie.modules.security.config.bean.SecurityProperties; import me.zhengjie.modules.security.security.*; import me.zhengjie.modules.security.service.OnlineUserService; -import me.zhengjie.modules.security.service.UserCacheClean; +import me.zhengjie.modules.security.service.UserCacheManager; import me.zhengjie.utils.enums.RequestMethodEnum; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -58,7 +58,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { private final ApplicationContext applicationContext; private final SecurityProperties properties; private final OnlineUserService onlineUserService; - private final UserCacheClean userCacheClean; + private final UserCacheManager userCacheManager; @Bean GrantedAuthorityDefaults grantedAuthorityDefaults() { @@ -138,7 +138,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { } private TokenConfigurer securityConfigurerAdapter() { - return new TokenConfigurer(tokenProvider, properties, onlineUserService, userCacheClean); + return new TokenConfigurer(tokenProvider, properties, onlineUserService, userCacheManager); } private Map> getAnonymousUrl(Map handlerMethodMap) { diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java index 7ce91fc8..1e00f2fe 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/config/bean/LoginProperties.java @@ -20,7 +20,6 @@ import com.wf.captcha.base.Captcha; import lombok.Data; import me.zhengjie.exception.BadConfigurationException; import me.zhengjie.utils.StringUtils; - import java.awt.*; import java.util.Objects; @@ -40,19 +39,12 @@ public class LoginProperties { private LoginCode loginCode; - /** - * 用户登录信息缓存 - */ - private boolean cacheEnable; + public static final String cacheKey = "USER-LOGIN-DATA"; public boolean isSingleLogin() { return singleLogin; } - public boolean isCacheEnable() { - return cacheEnable; - } - /** * 获取验证码生产类 * diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenConfigurer.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenConfigurer.java index 94e25477..cff5e1ed 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenConfigurer.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/security/TokenConfigurer.java @@ -18,7 +18,7 @@ package me.zhengjie.modules.security.security; import lombok.RequiredArgsConstructor; import me.zhengjie.modules.security.config.bean.SecurityProperties; import me.zhengjie.modules.security.service.OnlineUserService; -import me.zhengjie.modules.security.service.UserCacheClean; +import me.zhengjie.modules.security.service.UserCacheManager; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.DefaultSecurityFilterChain; @@ -33,11 +33,11 @@ public class TokenConfigurer extends SecurityConfigurerAdapter - * 用户信息变更时 - * - * @param userName / - */ - public void cleanUserCache(String userName) { - if (StringUtils.isNotEmpty(userName)) { - userCacheManager.remove(userName); - } - } - - /** - * 清理所有用户的缓存信息
- * ,如发生角色授权信息变化,可以简便的全部失效缓存 - */ - public void cleanAll() { - userCacheManager.clear(); - } -} diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserCacheManager.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserCacheManager.java index 8eaccd5f..3a8afe72 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserCacheManager.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserCacheManager.java @@ -1,110 +1,82 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * 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 me.zhengjie.modules.security.service; -import lombok.extern.slf4j.Slf4j; +import cn.hutool.core.util.RandomUtil; +import me.zhengjie.modules.security.config.bean.LoginProperties; import me.zhengjie.modules.security.service.dto.JwtUserDto; +import me.zhengjie.utils.RedisUtils; +import me.zhengjie.utils.StringUtils; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; - -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; +import javax.annotation.Resource; /** - * 用户缓存 - * - * @author TikiWong - * @date 2022/1/27 8:23 + * @author Zheng Jie + * @description 用户缓存管理 + * @date 2022-05-26 **/ -@Slf4j @Component public class UserCacheManager { - @Value("${user-cache.min-evictable-size}") - private int minEvictableSize; - @Value("${user-cache.min-evictable-interval}") - private long minEvictableInterval; - @Value("${user-cache.min-idle-time}") - private long minIdleTime; + @Resource + private RedisUtils redisUtils; + @Value("${login.user-cache.idle-time}") + private long idleTime; - private final Map cache = new ConcurrentHashMap<>(); - private final AtomicBoolean expelLock = new AtomicBoolean(true); - private long nextMinEvictableTime = 0; - - public Future putIfAbsent(String username, Future ft) { - Node tryNode = new Node(ft); - Node node = cache.putIfAbsent(username, tryNode); - expel(); - return nodeToDate(node); + /** + * 返回用户缓存 + * @param userName 用户名 + * @return JwtUserDto + */ + public JwtUserDto getUserCache(String userName) { + if (StringUtils.isNotEmpty(userName)) { + // 获取数据 + Object obj = redisUtils.hget(LoginProperties.cacheKey, userName); + if(obj != null){ + return (JwtUserDto)obj; + } + } + return null; } /** - * 缓存回收 - * 为避免超过边界后回收热点数据设置了最小生存时间 - * 回收时会保留在最小生存时间内的数据 - **/ - public void expel() { - long now = System.currentTimeMillis(); - if (cache.size() < minEvictableSize || - now < nextMinEvictableTime || - !expelLock.compareAndSet(true, false)) { - return; - } - long oldestTime = now; - int evictedCount = 0; - try { - Iterator> iterator = cache.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - long nodeTime = entry.getValue().getTime(); - if (nodeTime + minIdleTime < now) { - iterator.remove(); - evictedCount++; - } - oldestTime = Math.min(oldestTime, nodeTime); - } - } finally { - this.nextMinEvictableTime = Math.max(now + minEvictableInterval, oldestTime); - expelLock.set(true); - log.info("回收掉【{}】条用户缓存, 剩余缓存数为【{}】,下次可回收时间为【{}】秒后", - evictedCount, - cache.size(), - (this.nextMinEvictableTime - now) / 1000); + * 添加缓存到Redis + * @param userName 用户名 + */ + @Async + public void addUserCache(String userName, JwtUserDto user) { + if (StringUtils.isNotEmpty(userName)) { + // 添加数据, 避免数据同时过期 + long time = idleTime + RandomUtil.randomInt(900, 1800); + redisUtils.hset(LoginProperties.cacheKey, userName, user, time); } } - public Future get(String username) { - return nodeToDate(cache.get(username)); - } - - public void clear() { - cache.clear(); - } - - public void remove(String username) { - cache.remove(username); - } - - private Future nodeToDate(Node node) { - return node == null ? null : node.getData(); - } - - private static class Node { - private final Future data; - private final long time; - - public Node(Future data) { - this.data = data; - this.time = System.currentTimeMillis(); - } - - public Future getData() { - return data; - } - - public long getTime() { - return time; + /** + * 清理用户缓存信息 + * 用户信息变更时 + * @param userName 用户名 + */ + @Async + public void cleanUserCache(String userName) { + if (StringUtils.isNotEmpty(userName)) { + // 清除数据 + redisUtils.hdel(LoginProperties.cacheKey, userName); } } -} +} \ No newline at end of file diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserDetailsServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserDetailsServiceImpl.java index 7e5befd9..70db5df0 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserDetailsServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/service/UserDetailsServiceImpl.java @@ -16,50 +16,38 @@ package me.zhengjie.modules.security.service; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.EntityNotFoundException; -import me.zhengjie.modules.security.config.bean.LoginProperties; import me.zhengjie.modules.security.service.dto.JwtUserDto; import me.zhengjie.modules.system.service.DataService; import me.zhengjie.modules.system.service.RoleService; import me.zhengjie.modules.system.service.UserService; -import me.zhengjie.modules.system.service.dto.UserDto; +import me.zhengjie.modules.system.service.dto.UserLoginDto; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; - /** * @author Zheng Jie * @date 2018-11-22 */ +@Slf4j @RequiredArgsConstructor @Service("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService { private final UserService userService; private final RoleService roleService; private final DataService dataService; - private final LoginProperties loginProperties; - - private final UserCacheManager USER_DTO_CACHE; - - public void setEnableCache(boolean enableCache) { - this.loginProperties.setCacheEnable(enableCache); - } - - public static ExecutorService executor = newThreadPool(); + private final UserCacheManager userCacheManager; @Override public JwtUserDto loadUserByUsername(String username) { - JwtUserDto jwtUserDto = null; - Future future = USER_DTO_CACHE.get(username); - if (!loginProperties.isCacheEnable()) { - UserDto user; + JwtUserDto jwtUserDto = userCacheManager.getUserCache(username); + if(jwtUserDto == null){ + UserLoginDto user; try { - user = userService.findByName(username); + user = userService.getLoginData(username); } catch (EntityNotFoundException e) { // SpringSecurity会自动转换UsernameNotFoundException为BadCredentialsException throw new UsernameNotFoundException(username, e); @@ -75,85 +63,10 @@ public class UserDetailsServiceImpl implements UserDetailsService { dataService.getDeptIds(user), roleService.mapToGrantedAuthorities(user) ); + // 添加缓存数据 + userCacheManager.addUserCache(username, jwtUserDto); } - return jwtUserDto; - } - - if (future == null) { - Callable call = () -> getJwtBySearchDb(username); - FutureTask ft = new FutureTask<>(call); - future = USER_DTO_CACHE.putIfAbsent(username, ft); - if (future == null) { - future = ft; - executor.submit(ft); - } - try { - return future.get(); - } catch (CancellationException e) { - USER_DTO_CACHE.remove(username); - System.out.println("error" + Thread.currentThread().getName()); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e.getMessage()); - } - } else { - try { - jwtUserDto = future.get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e.getMessage()); - } - // 检查dataScope是否修改 - List dataScopes = jwtUserDto.getDataScopes(); - dataScopes.clear(); - dataScopes.addAll(dataService.getDeptIds(jwtUserDto.getUser())); - } return jwtUserDto; - - } - - private JwtUserDto getJwtBySearchDb(String username) { - UserDto user; - try { - user = userService.findByName(username); - } catch (EntityNotFoundException e) { - // SpringSecurity会自动转换UsernameNotFoundException为BadCredentialsException - throw new UsernameNotFoundException("", e); - } - if (user == null) { - throw new UsernameNotFoundException(""); - } else { - if (!user.getEnabled()) { - throw new BadRequestException("账号未激活!"); - } - return new JwtUserDto( - user, - dataService.getDeptIds(user), - roleService.mapToGrantedAuthorities(user) - ); - } - - } - - public static ExecutorService newThreadPool() { - ThreadFactory namedThreadFactory = new ThreadFactory() { - final AtomicInteger sequence = new AtomicInteger(1); - - @Override - public Thread newThread(Runnable r) { - Thread thread = new Thread(r); - int seq = this.sequence.getAndIncrement(); - thread.setName("future-task-thread" + (seq > 1 ? "-" + seq : "")); - if (!thread.isDaemon()) { - thread.setDaemon(true); - } - - return thread; - } - }; - return new ThreadPoolExecutor(10, 200, - 0L, TimeUnit.MILLISECONDS, - new LinkedBlockingQueue<>(1024), - namedThreadFactory, - new ThreadPoolExecutor.AbortPolicy()); } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/service/dto/JwtUserDto.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/service/dto/JwtUserDto.java index 52e84961..5aa0c45f 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/service/dto/JwtUserDto.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/service/dto/JwtUserDto.java @@ -18,8 +18,7 @@ package me.zhengjie.modules.security.service.dto; import com.alibaba.fastjson.annotation.JSONField; import lombok.AllArgsConstructor; import lombok.Getter; -import me.zhengjie.modules.system.service.dto.UserDto; -import org.springframework.security.core.GrantedAuthority; +import me.zhengjie.modules.system.service.dto.UserLoginDto; import org.springframework.security.core.userdetails.UserDetails; import java.util.List; import java.util.Set; @@ -33,11 +32,10 @@ import java.util.stream.Collectors; @AllArgsConstructor public class JwtUserDto implements UserDetails { - private final UserDto user; + private final UserLoginDto user; private final List dataScopes; - @JSONField(serialize = false) private final List authorities; public Set getRoles() { diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/UserService.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/UserService.java index babf592f..8d63fa86 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/UserService.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/UserService.java @@ -17,6 +17,7 @@ package me.zhengjie.modules.system.service; import me.zhengjie.modules.system.domain.User; import me.zhengjie.modules.system.service.dto.UserDto; +import me.zhengjie.modules.system.service.dto.UserLoginDto; import me.zhengjie.modules.system.service.dto.UserQueryCriteria; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; @@ -65,6 +66,13 @@ public interface UserService { */ UserDto findByName(String userName); + /** + * 根据用户名查询 + * @param userName / + * @return / + */ + UserLoginDto getLoginData(String userName); + /** * 修改密码 * @param username 用户名 diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/UserLoginDto.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/UserLoginDto.java new file mode 100644 index 00000000..13a51f77 --- /dev/null +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/UserLoginDto.java @@ -0,0 +1,28 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * 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 me.zhengjie.modules.system.service.dto; + +/** + * @author Zheng Jie + * @description 用户缓存时使用 + * @date 2022-05-26 + **/ +public class UserLoginDto extends UserDto { + + private String password; + + private Boolean isAdmin; +} diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java index 7f49f5ea..def575ea 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/RoleServiceImpl.java @@ -18,7 +18,7 @@ package me.zhengjie.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; import me.zhengjie.exception.BadRequestException; -import me.zhengjie.modules.security.service.UserCacheClean; +import me.zhengjie.modules.security.service.UserCacheManager; import me.zhengjie.modules.security.service.dto.AuthorityDto; import me.zhengjie.modules.system.domain.Menu; import me.zhengjie.modules.system.domain.Role; @@ -60,7 +60,7 @@ public class RoleServiceImpl implements RoleService { private final RoleSmallMapper roleSmallMapper; private final RedisUtils redisUtils; private final UserRepository userRepository; - private final UserCacheClean userCacheClean; + private final UserCacheManager userCacheManager; @Override public List queryAll() { @@ -213,7 +213,7 @@ public class RoleServiceImpl implements RoleService { public void delCaches(Long id, List users) { users = CollectionUtil.isEmpty(users) ? userRepository.findByRoleId(id) : users; if (CollectionUtil.isNotEmpty(users)) { - users.forEach(item -> userCacheClean.cleanUserCache(item.getUsername())); + users.forEach(item -> userCacheManager.cleanUserCache(item.getUsername())); Set userIds = users.stream().map(User::getId).collect(Collectors.toSet()); redisUtils.delByKeys(CacheKey.DATA_USER, userIds); redisUtils.delByKeys(CacheKey.MENU_USER, userIds); diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java index 3d96c23e..6342d130 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/UserServiceImpl.java @@ -19,16 +19,14 @@ import lombok.RequiredArgsConstructor; import me.zhengjie.config.FileProperties; import me.zhengjie.exception.BadRequestException; import me.zhengjie.modules.security.service.OnlineUserService; -import me.zhengjie.modules.security.service.UserCacheClean; +import me.zhengjie.modules.security.service.UserCacheManager; import me.zhengjie.modules.system.domain.User; import me.zhengjie.exception.EntityExistException; import me.zhengjie.exception.EntityNotFoundException; import me.zhengjie.modules.system.repository.UserRepository; import me.zhengjie.modules.system.service.UserService; -import me.zhengjie.modules.system.service.dto.JobSmallDto; -import me.zhengjie.modules.system.service.dto.RoleSmallDto; -import me.zhengjie.modules.system.service.dto.UserDto; -import me.zhengjie.modules.system.service.dto.UserQueryCriteria; +import me.zhengjie.modules.system.service.dto.*; +import me.zhengjie.modules.system.service.mapstruct.UserLoginMapper; import me.zhengjie.modules.system.service.mapstruct.UserMapper; import me.zhengjie.utils.*; import org.springframework.cache.annotation.CacheConfig; @@ -58,8 +56,9 @@ public class UserServiceImpl implements UserService { private final UserMapper userMapper; private final FileProperties properties; private final RedisUtils redisUtils; - private final UserCacheClean userCacheClean; + private final UserCacheManager userCacheManager; private final OnlineUserService onlineUserService; + private final UserLoginMapper userLoginMapper; @Override public Object queryAll(UserQueryCriteria criteria, Pageable pageable) { @@ -175,6 +174,16 @@ public class UserServiceImpl implements UserService { } } + @Override + public UserLoginDto getLoginData(String userName) { + User user = userRepository.findByUsername(userName); + if (user == null) { + throw new EntityNotFoundException(User.class, "name", userName); + } else { + return userLoginMapper.toDto(user); + } + } + @Override @Transactional(rollbackFor = Exception.class) public void updatePass(String username, String pass) { @@ -252,6 +261,6 @@ public class UserServiceImpl implements UserService { * @param username / */ private void flushCache(String username) { - userCacheClean.cleanUserCache(username); + userCacheManager.cleanUserCache(username); } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/system/service/mapstruct/UserLoginMapper.java b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/mapstruct/UserLoginMapper.java new file mode 100644 index 00000000..fbb88139 --- /dev/null +++ b/eladmin-system/src/main/java/me/zhengjie/modules/system/service/mapstruct/UserLoginMapper.java @@ -0,0 +1,30 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * 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 me.zhengjie.modules.system.service.mapstruct; + +import me.zhengjie.base.BaseMapper; +import me.zhengjie.modules.system.domain.User; +import me.zhengjie.modules.system.service.dto.UserLoginDto; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; + +/** + * @author Zheng Jie + * @date 2018-11-23 + */ +@Mapper(componentModel = "spring",uses = {RoleMapper.class, DeptMapper.class, JobMapper.class},unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface UserLoginMapper extends BaseMapper { +} diff --git a/eladmin-system/src/main/resources/config/application-dev.yml b/eladmin-system/src/main/resources/config/application-dev.yml index c7188533..c96a9233 100644 --- a/eladmin-system/src/main/resources/config/application-dev.yml +++ b/eladmin-system/src/main/resources/config/application-dev.yml @@ -51,10 +51,12 @@ spring: # 登录相关配置 login: - # 登录缓存 - cache-enable: true # 是否限制单用户登录 single-login: false + # Redis用户登录缓存配置 + user-cache: + # 存活时间/秒 + idle-time: 7200 # 验证码 login-code: # 验证码类型配置 查看 LoginProperties 类 diff --git a/eladmin-system/src/main/resources/config/application-prod.yml b/eladmin-system/src/main/resources/config/application-prod.yml index bdfe5687..6031cb8c 100644 --- a/eladmin-system/src/main/resources/config/application-prod.yml +++ b/eladmin-system/src/main/resources/config/application-prod.yml @@ -52,10 +52,12 @@ spring: # 登录相关配置 login: - # 登录缓存 - cache-enable: true # 是否限制单用户登录 single-login: false + # Redis用户登录缓存配置 + user-cache: + # 存活时间/秒 + idle-time: 7200 # 验证码 login-code: # 验证码类型配置 查看 LoginProperties 类 diff --git a/eladmin-system/src/main/resources/config/application.yml b/eladmin-system/src/main/resources/config/application.yml index 587785ab..6caf386c 100644 --- a/eladmin-system/src/main/resources/config/application.yml +++ b/eladmin-system/src/main/resources/config/application.yml @@ -55,13 +55,4 @@ code: #密码加密传输,前端公钥加密,后端私钥解密 rsa: - private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== - -# 内存用户缓存配置 -user-cache: - # 最小回收数(当缓存数量达到此值时进行回收) - min-evictable-size: 512 - # 最小回收间隔 - min-evictable-interval: 1800000 - # 最小存活时间 (ms) - min-idle-time: 3600000 \ No newline at end of file + private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== \ No newline at end of file