欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Security 強(qiáng)制退出指定用戶的方法

 更新時(shí)間:2018年03月09日 11:46:14   作者:Anoyi  
本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

應(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)限:

  1. 管理員(ROLE_MANAGER):基本操作 + 管理操作
  2. 普通用戶(ROLE_USER):基本操作
  3. 拉黑用戶(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實(shí)現(xiàn)上傳和下載功能(支持多個(gè)文件同時(shí)上傳)

    Java實(shí)現(xiàn)上傳和下載功能(支持多個(gè)文件同時(shí)上傳)

    這篇文章主要介紹了Java實(shí)現(xiàn)上傳和下載功能,支持多個(gè)文件同時(shí)上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • IDEA POJO開(kāi)發(fā)神器之Groovy的使用詳解

    IDEA 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)的坑

    這篇文章主要介紹了解決BufferedReader.readLine()遇見(jiàn)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java實(shí)現(xiàn)直接插入排序與折半插入排序的示例詳解

    Java實(shí)現(xiàn)直接插入排序與折半插入排序的示例詳解

    這篇文章主要為大家詳細(xì)介紹了插入排序中兩個(gè)常見(jiàn)的排序:直接插入排序與折半插入排序。本文用Java語(yǔ)言實(shí)現(xiàn)了這兩個(gè)排序算法,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • Java語(yǔ)言中Swing組件編程詳解

    Java語(yǔ)言中Swing組件編程詳解

    這篇文章主要為大家介紹了Java語(yǔ)言中Swing組件編程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Spring 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)示例源碼

    這篇文章主要介紹了Spring gateway配置Spring Security實(shí)現(xiàn)統(tǒng)一權(quán)限驗(yàn)證與授權(quán),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java經(jīng)典面試題最全匯總208道(六)

    Java經(jīng)典面試題最全匯總208道(六)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(六),本文章內(nèi)容詳細(xì),該模塊分為了六個(gè)部分,本次為第六部分,需要的朋友可以參考下
    2023-01-01
  • Java中List集合的常用方法詳解

    Java中List集合的常用方法詳解

    本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于Java中List集合的常用方法詳解,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。下面我們就來(lái)學(xué)習(xí)一下吧
    2021-11-11
  • 淺談springfox-swagger原理解析與使用過(guò)程中遇到的坑

    淺談springfox-swagger原理解析與使用過(guò)程中遇到的坑

    本篇文章主要介紹了淺談springfox-swagger原理解析與使用過(guò)程中遇到的坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析

    java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析

    這篇文章主要介紹了java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論