From 788c10e6a69679608a9c086537cd8523ecd6ecf0 Mon Sep 17 00:00:00 2001 From: YangJie <2313381768@qq.com> Date: Thu, 29 Dec 2022 20:18:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=BB=98=E8=AE=A4=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=86=85=E5=AD=98=E4=B8=8D=E8=BF=9E=E6=8E=A5redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/SecurityConfiguration.java | 12 ++++++++-- .../filter/JwtAuthorizationFilter.java | 21 ++++++++++++++++-- .../security/service/AuthService.java | 22 +++++++++++++++++-- .../system/config/MemoryConfig.java | 19 ++++++++++++++++ src/main/resources/application.yaml | 3 +++ 5 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/main/java/github/javaguide/springsecurityjwtguide/system/config/MemoryConfig.java diff --git a/src/main/java/github/javaguide/springsecurityjwtguide/security/config/SecurityConfiguration.java b/src/main/java/github/javaguide/springsecurityjwtguide/security/config/SecurityConfiguration.java index 509d853..b3381a9 100644 --- a/src/main/java/github/javaguide/springsecurityjwtguide/security/config/SecurityConfiguration.java +++ b/src/main/java/github/javaguide/springsecurityjwtguide/security/config/SecurityConfiguration.java @@ -4,6 +4,8 @@ import github.javaguide.springsecurityjwtguide.security.exception.JwtAccessDeniedHandler; import github.javaguide.springsecurityjwtguide.security.exception.JwtAuthenticationEntryPoint; import github.javaguide.springsecurityjwtguide.security.filter.JwtAuthorizationFilter; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.http.HttpMethod; @@ -18,6 +20,7 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import java.util.Arrays; +import java.util.Map; import static java.util.Collections.singletonList; import static org.springframework.security.config.Customizer.withDefaults; @@ -34,8 +37,13 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private final StringRedisTemplate stringRedisTemplate; - public SecurityConfiguration(StringRedisTemplate stringRedisTemplate) { + private final Map cacheMap; + + private Boolean redisCacheSwitch; + public SecurityConfiguration(StringRedisTemplate stringRedisTemplate, @Qualifier(value = "cacheMap") Map cacheMap, @Value("${redis.cache-switch}") Boolean redisCacheSwitch) { this.stringRedisTemplate = stringRedisTemplate; + this.cacheMap = cacheMap; + this.redisCacheSwitch = redisCacheSwitch; } /** @@ -62,7 +70,7 @@ protected void configure(HttpSecurity http) throws Exception { .anyRequest().authenticated() .and() //添加自定义Filter - .addFilter(new JwtAuthorizationFilter(authenticationManager(), stringRedisTemplate)) + .addFilter(new JwtAuthorizationFilter(authenticationManager(), stringRedisTemplate, cacheMap, redisCacheSwitch)) // 不需要session(不创建会话) .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() // 授权异常处理 diff --git a/src/main/java/github/javaguide/springsecurityjwtguide/security/filter/JwtAuthorizationFilter.java b/src/main/java/github/javaguide/springsecurityjwtguide/security/filter/JwtAuthorizationFilter.java index 81684c8..7f070a6 100644 --- a/src/main/java/github/javaguide/springsecurityjwtguide/security/filter/JwtAuthorizationFilter.java +++ b/src/main/java/github/javaguide/springsecurityjwtguide/security/filter/JwtAuthorizationFilter.java @@ -4,6 +4,8 @@ import github.javaguide.springsecurityjwtguide.security.common.utils.JwtTokenUtils; import io.jsonwebtoken.JwtException; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -15,6 +17,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.Map; /** * @author shuang.kou @@ -25,9 +28,17 @@ public class JwtAuthorizationFilter extends BasicAuthenticationFilter { private final StringRedisTemplate stringRedisTemplate; - public JwtAuthorizationFilter(AuthenticationManager authenticationManager, StringRedisTemplate stringRedisTemplate) { + private final Map cacheMap; + + private Boolean redisCacheSwitch; + public JwtAuthorizationFilter(AuthenticationManager authenticationManager, + StringRedisTemplate stringRedisTemplate, + Map cacheMap, + Boolean redisCacheSwitch) { super(authenticationManager); this.stringRedisTemplate = stringRedisTemplate; + this.cacheMap = cacheMap; + this.redisCacheSwitch = redisCacheSwitch; } @Override @@ -44,7 +55,13 @@ protected void doFilterInternal(HttpServletRequest request, String tokenValue = token.replace(SecurityConstants.TOKEN_PREFIX, ""); UsernamePasswordAuthenticationToken authentication = null; try { - String previousToken = stringRedisTemplate.opsForValue().get(JwtTokenUtils.getId(tokenValue)); + String previousToken = ""; + if (redisCacheSwitch) { + previousToken = stringRedisTemplate.opsForValue().get(JwtTokenUtils.getId(tokenValue)); + }else { + previousToken = cacheMap.get(JwtTokenUtils.getId(tokenValue)); + } + if (!token.equals(previousToken)) { SecurityContextHolder.clearContext(); chain.doFilter(request, response); diff --git a/src/main/java/github/javaguide/springsecurityjwtguide/security/service/AuthService.java b/src/main/java/github/javaguide/springsecurityjwtguide/security/service/AuthService.java index 43e24ee..c5f0432 100644 --- a/src/main/java/github/javaguide/springsecurityjwtguide/security/service/AuthService.java +++ b/src/main/java/github/javaguide/springsecurityjwtguide/security/service/AuthService.java @@ -8,12 +8,16 @@ import github.javaguide.springsecurityjwtguide.system.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -25,6 +29,11 @@ public class AuthService { private final UserService userService; private final StringRedisTemplate stringRedisTemplate; private final CurrentUserUtils currentUserUtils; + @Qualifier(value = "cacheMap") + private final Map cacheMap ; + + @Value("${redis.cache-switch}") + private Boolean redisCacheSwitch; public String createToken(LoginRequest loginRequest) { User user = userService.find(loginRequest.getUsername()); @@ -40,11 +49,20 @@ public String createToken(LoginRequest loginRequest) { .map(GrantedAuthority::getAuthority) .collect(Collectors.toList()); String token = JwtTokenUtils.createToken(user.getUserName(), user.getId().toString(), authorities, loginRequest.getRememberMe()); - stringRedisTemplate.opsForValue().set(user.getId().toString(), token); + if (redisCacheSwitch) { + stringRedisTemplate.opsForValue().set(user.getId().toString(), token); + }else { + cacheMap.put(user.getId().toString(), token); + } + return token; } public void removeToken() { - stringRedisTemplate.delete(currentUserUtils.getCurrentUser().getId().toString()); + if (redisCacheSwitch) { + stringRedisTemplate.delete(currentUserUtils.getCurrentUser().getId().toString()); + }else { + cacheMap.remove(currentUserUtils.getCurrentUser().getId().toString()); + } } } diff --git a/src/main/java/github/javaguide/springsecurityjwtguide/system/config/MemoryConfig.java b/src/main/java/github/javaguide/springsecurityjwtguide/system/config/MemoryConfig.java new file mode 100644 index 0000000..48c71ef --- /dev/null +++ b/src/main/java/github/javaguide/springsecurityjwtguide/system/config/MemoryConfig.java @@ -0,0 +1,19 @@ +package github.javaguide.springsecurityjwtguide.system.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +@Configuration +public class MemoryConfig { + + @Bean(name = "cacheMap") + public Map cacheMap(){ + return new HashMap<>(); + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index f751152..a7b4a88 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -43,3 +43,6 @@ spring: max-idle: 8 # 连接池中的最小空闲连接 默认 0 min-idle: 0 + +redis: + cache-switch: false