91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Security如何強制退出指定用戶

發布時間:2021-08-05 15:29:23 來源:億速云 閱讀:267 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Spring Security如何強制退出指定用戶,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

應用場景

最近社區總有人發文章帶上小廣告,嚴重影響社區氛圍,好氣!對于這種類型的用戶,就該永久拉黑!

社區的安全框架使用了 spring-security 和 spring-session,登錄狀態 30 天有效,session 信息是存在 redis 中,如何優雅地處理這些不老實的用戶呢?

首先,簡單劃分下用戶的權限:

  1. 管理員(ROLE_MANAGER):基本操作 + 管理操作

  2. 普通用戶(ROLE_USER):基本操作

  3. 拉黑用戶(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 Security如何強制退出指定用戶”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

谷城县| 思茅市| 奈曼旗| 丁青县| 凤翔县| 崇义县| 西城区| 聂荣县| 彰化市| 贵州省| 瓮安县| 长垣县| 枣强县| 社旗县| 申扎县| 随州市| 阿勒泰市| 万载县| 长乐市| 象山县| 壶关县| 静安区| 淮滨县| 渑池县| 安丘市| 平江县| 来凤县| 桦甸市| 延长县| 江门市| 平阳县| 合阳县| 禹城市| 民和| 嘉峪关市| 丹凤县| 桃源县| 永仁县| 北安市| 柳州市| 志丹县|