Spring Security 強(qiáng)制退出指定用戶的方法
應(yīng)用場(chǎng)景
最近社區(qū)總有人發(fā)文章帶上小廣告,嚴(yán)重影響社區(qū)氛圍,好氣!對(duì)于這種類型的用戶,就該永久拉黑!
社區(qū)的安全框架使用了 spring-security 和 spring-session,登錄狀態(tài) 30 天有效,session 信息是存在 redis 中,如何優(yōu)雅地處理這些不老實(shí)的用戶呢?
首先,簡(jiǎn)單劃分下用戶的權(quán)限:
- 管理員(ROLE_MANAGER):基本操作 + 管理操作
- 普通用戶(ROLE_USER):基本操作
- 拉黑用戶(ROLE_BLACK):不允許登錄
然后,拉黑指定用戶(ROLE_USER -> ROLE_BLACK),再?gòu)?qiáng)制該用戶退出即可(刪除該用戶在 redis 中 session 信息)。
項(xiàng)目相關(guān)依賴及配置
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 連接相關(guān)配置 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(); } }
強(qiáng)制退出指定給用戶接口
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),結(jié)合自身業(yè)務(wù)邏輯來(lái)實(shí)現(xiàn) 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); } }
說(shuō)明 indexName 為 Principal.getName() 的返回值。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring security用戶URL權(quán)限FilterSecurityInterceptor使用解析
- Spring Security實(shí)現(xiàn)禁止用戶重復(fù)登陸的配置原理
- SpringSecurity動(dòng)態(tài)加載用戶角色權(quán)限實(shí)現(xiàn)登錄及鑒權(quán)功能
- SpringBoot2.0 整合 SpringSecurity 框架實(shí)現(xiàn)用戶權(quán)限安全管理方法
- Java中SpringSecurity密碼錯(cuò)誤5次鎖定用戶的實(shí)現(xiàn)方法
- 解決Spring Security 用戶帳號(hào)已被鎖定問(wèn)題
相關(guān)文章
Java實(shí)現(xiàn)上傳和下載功能(支持多個(gè)文件同時(shí)上傳)
這篇文章主要介紹了Java實(shí)現(xiàn)上傳和下載功能,支持多個(gè)文件同時(shí)上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12IDEA POJO開(kāi)發(fā)神器之Groovy的使用詳解
這篇文章主要介紹了IDEA POJO開(kāi)發(fā)神器之Groovy的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07解決BufferedReader.readLine()遇見(jiàn)的坑
這篇文章主要介紹了解決BufferedReader.readLine()遇見(jiàn)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java實(shí)現(xiàn)直接插入排序與折半插入排序的示例詳解
這篇文章主要為大家詳細(xì)介紹了插入排序中兩個(gè)常見(jiàn)的排序:直接插入排序與折半插入排序。本文用Java語(yǔ)言實(shí)現(xiàn)了這兩個(gè)排序算法,感興趣的可以學(xué)習(xí)一下2022-06-06Spring gateway配置Spring Security實(shí)現(xiàn)統(tǒng)一權(quán)限驗(yàn)證與授權(quán)示例源碼
這篇文章主要介紹了Spring gateway配置Spring Security實(shí)現(xiàn)統(tǒng)一權(quán)限驗(yàn)證與授權(quán),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07淺談springfox-swagger原理解析與使用過(guò)程中遇到的坑
本篇文章主要介紹了淺談springfox-swagger原理解析與使用過(guò)程中遇到的坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析
這篇文章主要介紹了java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11