1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| package com.hanqf.common;
import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit;
@Slf4j public class RedisTokenRepositoryImpl implements PersistentTokenRepository {
@Value("${rememberMe.expireTime:1209600}") private Integer rememberMeExpireTime;
private final String SERIES_PREFIX = "spring:security:rememberMe:series:"; private final String USERNAME_PREFIX = "spring:security:rememberMe:username:";
private RedisTemplate<String, Object> redisTemplate;
public RedisTokenRepositoryImpl(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; }
private String generateKey(String prefix, String var) { return prefix + var; }
@Override public void createNewToken(PersistentRememberMeToken token) { String key = generateKey(SERIES_PREFIX, token.getSeries()); if (Boolean.TRUE.equals(redisTemplate.persist(key))) { throw new DataIntegrityViolationException("Series Id '" + token.getSeries() + "' already exists!"); } else { Map<String, String> map = new HashMap<>(); map.put("username", token.getUsername()); map.put("tokenValue", token.getTokenValue()); map.put("date", String.valueOf(token.getDate().getTime())); map.put("series", token.getSeries());
redisTemplate.opsForValue().set(key, map); redisTemplate.expire(key, rememberMeExpireTime, TimeUnit.SECONDS); redisTemplate.opsForValue().set(generateKey(USERNAME_PREFIX, token.getUsername()), token.getSeries()); } }
@Override public void updateToken(String series, String tokenValue, Date lastUsed) { PersistentRememberMeToken token = this.getTokenForSeries(series); if (token != null) { PersistentRememberMeToken newToken = new PersistentRememberMeToken(token.getUsername(), series, tokenValue, new Date()); Map<String, String> map = new HashMap<>(); map.put("username", newToken.getUsername()); map.put("tokenValue", newToken.getTokenValue()); map.put("date", String.valueOf(newToken.getDate().getTime())); map.put("series", newToken.getSeries());
String key = generateKey(SERIES_PREFIX, series); redisTemplate.opsForValue().set(key, map); redisTemplate.expire(key, rememberMeExpireTime, TimeUnit.SECONDS); } }
@Override public PersistentRememberMeToken getTokenForSeries(String seriesId) { Map<String, String> map = (Map) redisTemplate.opsForValue().get(generateKey(SERIES_PREFIX, seriesId)); if (map == null) { return null; } String username = map.get("username"); String tokenValue = map.get("tokenValue"); String date = map.get("date");
if (null == username || null == tokenValue || null == date) { return null; } Long timestamp = Long.valueOf(date); Date time = new Date(timestamp);
PersistentRememberMeToken rememberMeToken = new PersistentRememberMeToken(username, seriesId, tokenValue, time); return rememberMeToken; }
@Override public void removeUserTokens(String username) { try {
String series = (String) redisTemplate.opsForValue().get(generateKey(USERNAME_PREFIX, username)); redisTemplate.delete(generateKey(USERNAME_PREFIX, username)); redisTemplate.delete(generateKey(SERIES_PREFIX, series)); } catch (Exception e) { log.error(e.getMessage()); } } }
|