最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑!
社区的安全框架使用了 spring-security 和 spring-session,登录状态 30 天有效,session 信息是存在 redis 中,如何优雅地处理这些不老实的用户呢?
首先,简单划分下用户的权限:
管理员(ROLE_MANAGER):基本操作 + 管理操作
普通用户(ROLE_USER):基本操作
拉黑用户(ROLE_BLACK):不允许登录
然后,拉黑指定用户(ROLE_USER -> ROLE_BLACK),再强制该用户退出即可(删除该用户在 redis 中 session 信息)。
项目相关依赖及配置Maven 依赖
org.springframework.boot spring-boot-starter-securityorg.springframework.boot spring-boot-starter-data-redisorg.springframework.session spring-session-data-redis
Spring Session 策略配置 application.yml
# 此处省略 redis 连接相关配置spring: session: store-type: redis
Spring Security 配置代码示例
@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/user
@PreAuthorize("hasRole('MANAGER')") @GetMapping("/manager/logout/{userId}") public ResponseBean data(@PathVariable() Long userId){ // 查询 PrincipalNameIndexName(Redis 用户信息的 key),结合自身业务逻辑来实现
String indexName = userService.getPrincipalNameIndexName(userId); // 查询用户的 Session 信息,返回值 key 为 sessionId
Map userSessions = sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, indexName); // 移除用户的 session 信息
List sessionIds = new ArrayList<>(userSessions.keySet()); for (String session : sessionIds) {
redisOperationsSessionRepository.deleteById(session);
} return ResponseBean.success(userSessions);
}
} 相关文档说明 indexName 为 Principal.getName() 的返回值。
Spring Session With Redis
作者:Anoyi
链接:https://www.jianshu.com/p/7766e0b9d98f



