微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Security 强制退出指定用户的方法

本篇文章主要介绍了Spring Security 强制退出指定用户方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

应用场景

最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑!

社区的安全框架使用了 spring-security 和 spring-session,登录状态 30 天有效,session 信息是存在 redis 中,如何优雅地处理这些不老实的用户呢?

首先,简单划分下用户的权限:

管理员(ROLE_MANAGER):基本操作 + 管理操作

普通用户(ROLE_USER):基本操作

拉黑用户(ROLE_BLACK):不允许登录

然后,拉黑指定用户(ROLE_USER -> ROLE_BLACK),再强制该用户退出即可(删除用户在 redis 中 session 信息)。

项目相关依赖及配置

Maven 依赖

org.springframework.bootspring-boot-starter-securityorg.springframework.bootspring-boot-starter-data-redisorg.springframework.sessionspring-session-data-redis

Spring Session 策略配置 application.yml

# 此处省略 redis 连接相关配置 spring: session: store-type: redis

Spring Security 配置代码示例

@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/user/**").authenticated() .antMatchers("/manager/**").hasAnyRole(RoleEnum.MANAGER.getMessage()) .anyRequest().permitAll() .and().formLogin().loginPage("/login").permitAll() .and().logout().permitAll() .and().csrf().disable(); } }

强制退出指定给用户接口

import com.spring4all.bean.ResponseBean; import com.spring4all.service.UserService; import lombok.AllArgsConstructor; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.Session; import org.springframework.session.data.redis.RedisOperationsSessionRepository; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; import java.util.Map; @RestController @AllArgsConstructor public class UserManageApi { private final FindByIndexNameSessionRepository extends Session> sessionRepository; private final RedisOperationsSessionRepository redisOperationsSessionRepository; private final UserService userService; /** * 管理指定用户退出登录 * @param userId 用户ID * @return 用户 Session 信息 */ @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() 的返回值。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐