php 强制用户 退出,Spring Security 强制退出指定用户的方法
应用场景
最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑!
社区的安全框架使用了 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-security
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.session
spring-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() 的返回值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
php 强制用户 退出,Spring Security 强制退出指定用户的方法相关推荐
- Spring Security Oauth2 JWT 实现用户认证授权功能
Spring Security Oauth2 JWT 一 用户认证授权 1. 需求分析 1.1 用户认证与授权 什么是用户身份认证? 用户身份认证即用户去访问系统资源时系统要求验证用户的身份信息,身份 ...
- Spring Security and Angular 实现用户认证
引言 度过了前端框架的技术选型之后,新系统起步. ng-alain,一款功能强大的前端框架,设计得很好,两大缺点,文档不详尽,框架代码不规范. 写前台拦截器的时候是在花了大约半小时的时间对代码进行全面 ...
- Spring Security 强制退出指定用户
应用场景 最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑! 社区的安全框架使用了 spring-security 和 spring-session,登录状态 ...
- spring security 自定义退出策略
项目需要,要求登录用户非空闲状态,不可退出.说白了就是,在退出的时候增加逻辑判断,如果状态为非空,就不让其退出. 仔细查看spring security文档,发现这个框架里维护了一个过滤器链,来提供服 ...
- Spring Security基于数据库认证用户登录
Spring Security为我们提供了默认的登录页面,通过重写以AuthenticationManagerBuilder为参数的configure方法,我们可基于各种数据存储来认证用户,比如内存. ...
- java授权失败_自定义Spring Security的身份验证失败处理方法
1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...
- CSRF攻击的原理和spring security对CSRF攻击的解决方法
对于CSRF攻击的原理,直接上图然后解释一下 一个用户通过浏览器成功登录一个网站,登陆成功后,服务器会返回一个该用户的唯一标识放入浏览器Cookie中,以此作为用户之后操作的唯一凭证.假设此时该用户在 ...
- java+timer+退出,java timer 兑现在指定时间执行方法
java timer 实现在指定时间执行方法 最近在弄一个定时发送的项目,需要定时执行方法,于是用到了Timer,但是我想要的功能网络上的资源比较少,所以自己研究了一下. 下面是我写的一些代码 imp ...
- linux 用户与用户发邮件,Linux自动向指定用户发送邮件
Linux自动向指定用户发送邮件 实现Linux向用户发送指定主题和指定内容的邮件,可以用mailx软件,mailx是UNIX系统上用来处理邮件的工具,使用它可以发送,读取邮件. 一.安装mailx ...
最新文章
- 一种解决启动进程传递参数过长的方法
- Python 爬虫练手项目—酒店信息爬取
- 【CV实战】年轻人的第一个深度学习图像分割项目应该是什么样的(Pytorch框架)?...
- Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)
- Win32项目关于MessageBox参数的详细说明
- Linux设备驱动之Kobject、Kset
- js 简单弹框toast
- [转]Extundelete--数据恢复软件
- 抽象同步器AQS应用之--阻塞队列BlockingQueue,如何保证任务一定被消费?
- rdlc 固定前两列每页都显示_现在的大学生,都不会论文排版了
- 使用XPO过程中的代码优化
- 使用ggplot2绘制心形
- 什么是 Elasticsearch?一篇搞懂
- 2022年6月 青少年软件编程(Python) 等级考试试卷(二级)
- 各种前端框架的下拉菜单收集
- 微信6.6.7版本摇塞子破解思路(居多图)
- C语言入门 九九乘法表
- Neutron — Bonding SR-IOV ports
- 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)
- 【Android Gradle 插件】ProductFlavor 配置 ( consumerProguardFiles 配置 | dimension 配置 )