Spring Security 强制退出指定用户的方法
2018-03-09 11:46
585 查看
应用场景
最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑!
社区的安全框架使用了 spring-security 和 spring-session,登录状态 30 天有效,session 信息是存在 redis 中,如何优雅地处理这些不老实的用户呢?
首先,简单划分下用户的权限:
- 管理员(ROLE_MANAGER):基本操作 + 管理操作
- 普通用户(ROLE_USER):基本操作
- 拉黑用户(ROLE_BLACK):不允许登录
然后,拉黑指定用户(ROLE_USER -> ROLE_BLACK),再强制该用户退出即可(删除该用户在 redis 中 session 信息)。
项目相关依赖及配置
Maven 依赖
<!-- 安全 Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Spring Session Redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
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<String, ? extends Session> userSessions = sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, indexName); // 移除用户的 session 信息 List<String> sessionIds = new ArrayList<>(userSessions.keySet()); for (String session : sessionIds) { redisOperationsSessionRepository.deleteById(session); } return ResponseBean.success(userSessions); } }
说明 indexName 为 Principal.getName() 的返回值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- Spring Boot中整合Spring Security并自定义验证代码实例
- Spring security实现权限管理示例
- Spring security实现登陆和权限角色控制
- Java中SpringSecurity密码错误5次锁定用户的实现方法
- java中自定义Spring Security权限控制管理示例(实战篇)
- Spring Boot(四)之使用JWT和Spring Security保护REST API
- Spring Boot如何使用Spring Security进行安全控制
- 详解使用Spring Security进行自动登录验证
- spring-boot集成spring-security的oauth2实现github登录网站的示例
相关文章推荐
- 强制退出已经登陆用户
- .net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
- .net强制退出主窗口的方法——Application.Exit()方法和System.Environment.Exit(System.Environment.ExitCode)
- 关于c#中强制退出程序运行的两个方法比较
- 重定义Home键后Android 强制退出并回到系统Home Screen的方法
- Java设置session超时(失效)的时间 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session 具体设置的方法有三种:
- 强制退出苹果Mac程序的六种方法
- PHP Callable强制指定回调类型的方法
- Centos 7关于rc.local脚本命令开机不执行及指定用户启动的解决方法
- php----(简1)后台强制用户退出
- Jlink被识别为盗版及keil烧录后弹框被强制退出的解决方法
- 重定义Home键后Android 强制退出并回到系统Home Screen的方法
- Redhat Enterprise Linux中使用vsftpd搭建指定用户指定目录的ftp服务器的方法
- Yii controller控制器下设置对于用户没有登录的请求跳转至指定URL的方法
- strongswan+freeradius+脚本控制踢掉指定用户方法
- C#如何控制方法的执行时间,超时则强制退出方法执行
- 重定义Home键后Android 强制退出并回到系统Home Screen的方法
- ecmall用户登录后自动退出解决方法
- .net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法