Spring Security 強制退出指定使用者
應用場景
最近社群總有人發文章帶上小廣告,嚴重影響社群氛圍,好氣!對於這種型別的使用者,就該永久拉黑!
社群的安全框架使用了 spring-security
和 spring-session
,登入狀態 30 天有效,session 資訊是存在 redis 中,如何優雅地處理這些不老實的使用者呢?
首先,簡單劃分下使用者的許可權:
管理員(ROLE_MANAGER):基本操作 + 管理操作
普通使用者(ROLE_USER):基本操作
拉黑使用者(ROLE_BLACK):不允許登入
然後,拉黑指定使用者(ROLE_USER -> ROLE_BLACK),再強制該使用者退出即可(刪除該使用者在 redis 中 session 資訊)。
專案相關依賴及配置
Maven 依賴
<!-- 安全 Security --><!-- Redis --> org.springframework.boot spring-boot-starter-security <!-- Spring Session Redis --> 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 配置程式碼示例
@EnableWebSecuritypublic 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@AllArgsConstructorpublic 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 MapuserSessions = 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() 的返回值。
相關文件
作者:Anoyi
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2802976/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Security原始碼分析八:Spring Security 退出Spring原始碼
- Spring Security系列之退出(十三)Spring
- c# 強制退出C#
- win10強制退出鍵是什麼 window10強制退出快捷鍵是哪個Win10
- 【轉】C# 中 強制退出WinForm程式C#ORM
- 教你如何強制退出Mac無響應程式Mac
- Spring Security 實戰乾貨:實現自定義退出登入Spring
- 深入理解Spring Security授權機制原理Spring
- Spring SecuritySpring
- php 使用Callable Closure強制指定回撥型別PHP型別
- Spring Security:使用者和Spring應用之間的安全屏障Spring
- Spring Boot —— Spring SecuritySpring Boot
- Spring Security原始碼分析九:Spring Security Session管理Spring原始碼Session
- 如何在Python退出時強制執行一段程式碼Python
- 應用程式無響應?如何在Mac上強制退出應用Mac
- Spring Security 上Spring
- 初探Spring SecuritySpring
- Spring Security(二)Spring
- spring security(一)Spring
- Spring Security(6)Spring
- Spring Security(7)Spring
- Spring Security(8)Spring
- Spring Security + JWTSpringJWT
- Spring Boot SecuritySpring Boot
- Spring Security研究Spring
- Spring Security原始碼分析七:Spring Security 記住我Spring原始碼
- Spring security(四)-spring boot +spring security簡訊認證+redis整合Spring BootRedis
- 如何從Spring Security 5遷移到Spring Security 6/Spring Boot 3Spring Boot
- Spring Boot整合Spring SecuritySpring Boot
- Spring MVC (Java),強制頁面不快取SpringMVCJava快取
- Spring Security原始碼分析一:Spring Security認證過程Spring原始碼
- Spring Security原始碼分析二:Spring Security授權過程Spring原始碼
- Spring Security 許可權管理的投票器與表決機制Spring
- 深入Spring Security-獲取認證機制核心原理講解Spring
- Spring Security詳解Spring
- Spring Security進階Spring
- Spring Security OAuth 2.0SpringOAuth
- 初識Spring SecuritySpring