springsecurity怎么存储特定的user到redis中案例
时间: 2024-02-15 20:02:31 浏览: 87
在使用 Spring Security 中,我们可以通过实现 UserDetailsService 接口来自定义用户信息的获取方式。通过这个接口,我们可以从 Redis 中获取用户信息,再交给 Spring Security 进行身份认证。
下面是一个示例代码,展示了如何在 Spring Security 中使用 Redis 存储用户信息:
1. 引入 Redis 相关依赖
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
```
2. 实现 UserDetailsService 接口
```java
@Service
public class RedisUserDetailsService implements UserDetailsService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String key = "user:" + username;
if (!redisTemplate.hasKey(key)) {
throw new UsernameNotFoundException("用户不存在");
}
Map<String, Object> userMap = (Map<String, Object>) redisTemplate.opsForHash().entries(key);
List<GrantedAuthority> authorities = new ArrayList<>();
for (String role : (List<String>) userMap.get("roles")) {
authorities.add(new SimpleGrantedAuthority(role));
}
return new User(username, (String) userMap.get("password"), authorities);
}
}
```
3. 配置 RedisTemplate
```java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return redisTemplate;
}
}
```
4. 将用户信息存储到 Redis 中
```java
String key = "user:" + username;
Map<String, Object> userMap = new HashMap<>();
userMap.put("username", username);
userMap.put("password", password);
userMap.put("roles", roles); // 用户角色列表
redisTemplate.opsForHash().putAll(key, userMap);
redisTemplate.expire(key, 30, TimeUnit.MINUTES); // 设置过期时间
```
通过以上步骤,我们可以将用户信息存储到 Redis 中,并且在使用 Spring Security 进行身份认证时,可以从 Redis 中获取用户信息。
阅读全文