在跟着博主三更草堂学习spring- security的课程中。我发现了我作为一个初学者可能需要理解知识点(如题)。
SecurityContextHolder
和 Redis
各自的作用:
SecurityContextHolder:
SecurityContextHolder
是 Spring Security 框架提供的一个类,用于在应用程序中保存当前已经被验证的用户的安全上下文信息。- 通过
SecurityContextHolder
,可以访问当前用户的身份信息,权限信息以及其他相关的安全信息,以便在应用程序中进行访问控制和权限管理。 - 这个上下文信息通常在应用程序的生命周期中持续存在,直到用户退出或会话结束。
Redis:
- Redis 是一个开源的内存数据库,通常被用作缓存、消息代理和键值存储。
- 在 Java Web 应用程序中,Redis 经常被用来缓存数据,例如用户会话信息、页面内容或其他需要频繁读取的数据。
- 使用 Redis 缓存可以提高应用程序的性能和扩展性,减轻数据库负担,并且可以实现分布式缓存,使多个应用程序实例可以共享缓存数据。
SecurityContextHolder
和 Redis
分别存储的信息:
SecurityContextHolder:
SecurityContextHolder
是 Spring Security 框架中的一个类,用于在应用程序中保存当前已验证用户的安全上下文信息。- 这个上下文信息通常包括当前用户的身份信息、权限信息以及其他相关的安全信息。
- 以下是一些可能存储在
SecurityContextHolder
中的信息:- 认证用户的身份信息(例如用户名、用户ID等)。
- 认证用户的权限信息(例如角色、权限列表等)。
- 认证用户的认证状态(已认证、未认证等)。
Redis:
- Redis 是一个高性能的键值存储数据库,通常用作缓存、消息代理和数据存储。
- 在 Java Web 应用程序中,Redis 经常被用来缓存数据、会话信息以及其他需要频繁读取或共享的数据。
- 以下是一些可能存储在 Redis 中的信息:
- 会话信息:包括用户的认证状态、会话标识符、会话数据等。
- 缓存数据:存储经常访问但不经常更改的数据,例如页面内容、计算结果等。
- 分布式锁:用于处理并发访问和确保数据的一致性。
- 消息队列数据:用于实现异步处理和事件驱动架构。
为什么有 SecurityContextHolder
还需要 Redis
?
@Override
public ResponseResult logout() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
Long userid = loginUser.getUser().getId();
redisCache.deleteObject("login:"+userid);
return new ResponseResult(200,"退出成功");
}
SecurityContextHolder
主要用于存储当前已验证用户的安全上下文信息,包括身份和权限信息,以便进行访问控制和权限管理。而 Redis
则用于存储缓存数据、会话信息以及其他需要频繁读取或共享的数据,以提高应用程序的性能和可扩展性。
因此,在代码实现执行登出操作时,删除 Redis 中的相关信息。不需要删除 SecurityContextHolder 的相关信息。(清除缓存,不需要清除对应用户的权限)