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

SpringBoot與Redis的令牌主動(dòng)失效機(jī)制實(shí)現(xiàn)

 更新時(shí)間:2024年12月10日 10:49:40   作者:cooldream2009  
本文詳細(xì)介紹了基于SpringBoot和Redis實(shí)現(xiàn)令牌主動(dòng)失效機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在現(xiàn)代Web系統(tǒng)中,用戶認(rèn)證是一個(gè)核心問(wèn)題,尤其是在分布式系統(tǒng)和微服務(wù)架構(gòu)中,如何高效、安全地管理用戶登錄狀態(tài)顯得尤為重要。通常,系統(tǒng)通過(guò)令牌(Token)來(lái)進(jìn)行身份驗(yàn)證,令牌的生命周期控制對(duì)于安全性非常關(guān)鍵。當(dāng)用戶修改密碼等敏感操作后,確保其之前的令牌失效,是一種常用的安全策略,可以有效防止憑證被盜后惡意訪問(wèn)的風(fēng)險(xiǎn)。本文將詳細(xì)介紹基于Spring Boot和Redis實(shí)現(xiàn)令牌主動(dòng)失效機(jī)制的設(shè)計(jì)與實(shí)現(xiàn)思路,幫助讀者理解和應(yīng)用該方案來(lái)提高系統(tǒng)的安全性和穩(wěn)定性。

1. 項(xiàng)目結(jié)構(gòu)和依賴配置

首先,我們需要基于Spring Boot搭建一個(gè)簡(jiǎn)單的Web項(xiàng)目,同時(shí)集成Redis作為緩存數(shù)據(jù)庫(kù),用于存儲(chǔ)和管理用戶令牌的狀態(tài)信息。通過(guò)引入Redis,能夠有效控制令牌的失效機(jī)制,從而實(shí)現(xiàn)對(duì)用戶認(rèn)證的動(dòng)態(tài)管理。

在這里插入圖片描述

1.1 項(xiàng)目依賴配置

在項(xiàng)目的pom.xml中添加如下依賴,用于集成Redis:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.2 Redis連接配置

application.yml中配置Redis的連接信息:

spring:
  redis:
    host: localhost
    port: 6379
    timeout: 6000ms
    lettuce:
      pool:
        max-active: 8
        max-idle: 2
        min-idle: 1
        max-wait: -1ms

該配置將連接本地的Redis實(shí)例,并定義了連接池的基本參數(shù)。具體參數(shù)根據(jù)項(xiàng)目需求可以進(jìn)一步調(diào)整。

2. 令牌主動(dòng)失效機(jī)制的實(shí)現(xiàn)流程

在這里插入圖片描述

在實(shí)現(xiàn)令牌主動(dòng)失效機(jī)制時(shí),我們需要進(jìn)行三步操作:

  • 用戶登錄成功后,系統(tǒng)會(huì)生成一個(gè)Token并將其存儲(chǔ)在Redis中。
  • 在后續(xù)的每次請(qǐng)求中,通過(guò)攔截器從Redis中驗(yàn)證令牌的有效性。
  • 當(dāng)用戶修改密碼等操作成功后,系統(tǒng)主動(dòng)刪除Redis中的Token,使之前的令牌失效。

下面將逐步實(shí)現(xiàn)上述功能。

2.1 登錄成功后將令牌存儲(chǔ)到Redis中

首先,在用戶登錄成功的情況下,系統(tǒng)會(huì)生成一個(gè)Token。為了方便講解,這里采用一個(gè)簡(jiǎn)單的UUID作為Token示例。生成的Token不僅返回給前端,也會(huì)同步存儲(chǔ)到Redis中,并設(shè)置一定的有效時(shí)間(如1小時(shí))。

示例代碼如下:

@Autowired
private StringRedisTemplate stringRedisTemplate;

public String login(String username, String password) {
    // 生成Token
    String token = UUID.randomUUID().toString();
    // 將Token存儲(chǔ)到Redis中,有效期1小時(shí)
    ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
    operations.set(token, token, 1, TimeUnit.HOURS);
    // 返回給用戶的響應(yīng)中包含Token
    return token;
}

上述代碼通過(guò)StringRedisTemplateopsForValue方法,將Token以鍵值對(duì)的形式存儲(chǔ)到Redis中。Redis緩存會(huì)定時(shí)清除過(guò)期數(shù)據(jù),因此可以避免手動(dòng)管理令牌的過(guò)期處理。

2.2 使用攔截器驗(yàn)證令牌

每次用戶請(qǐng)求時(shí),我們需要驗(yàn)證用戶攜帶的Token是否有效。通過(guò)Spring的攔截器機(jī)制,可以在請(qǐng)求進(jìn)入控制器之前檢查Redis中的Token,判斷其是否有效。若Token無(wú)效或已過(guò)期,則拒絕訪問(wèn)。

攔截器代碼如下:

public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 從請(qǐng)求頭中獲取Token
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            throw new RuntimeException("缺少令牌");
        }

        // 從Redis中查詢Token
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        String redisToken = operations.get(token);

        if (redisToken == null) {
            // Token不存在或已過(guò)期,拋出異常
            throw new RuntimeException("無(wú)效的令牌");
        }
        // Token有效,繼續(xù)處理請(qǐng)求
        return true;
    }
}

LoginInterceptor中,我們通過(guò)StringRedisTemplateopsForValue方法獲取Redis中的Token并與請(qǐng)求攜帶的Token對(duì)比。如果Token不存在,則直接拒絕該請(qǐng)求。若Token存在且有效,繼續(xù)進(jìn)行請(qǐng)求處理。

2.3 用戶修改密碼后刪除舊令牌

當(dāng)用戶成功修改密碼時(shí),需要確保之前的Token立即失效。因此,成功修改密碼后,我們需要從Redis中刪除該用戶的Token記錄,防止舊Token被再次使用。

在修改密碼的業(yè)務(wù)邏輯中,加入刪除Token的代碼:

public void changePassword(String username, String newPassword) {
    // 假設(shè)用戶驗(yàn)證通過(guò)并修改了密碼
    // 刪除Redis中的舊Token
    String token = getCurrentTokenForUser(username); // 從上下文或數(shù)據(jù)庫(kù)中獲取當(dāng)前用戶的Token
    ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
    operations.getOperations().delete(token);
}

在上述代碼中,通過(guò)getOperations().delete()方法刪除Token,使得舊Token立即失效。這樣用戶在修改密碼后需要重新登錄,保證了賬戶的安全性。

3. Redis的配置與測(cè)試

為了確保上述邏輯的正確性和Redis的穩(wěn)定性,建議在開(kāi)發(fā)階段通過(guò)單元測(cè)試驗(yàn)證Redis的連接和數(shù)據(jù)操作。

@SpringBootTest
class RedisTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void testSet() {
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        operations.set("username", "zhangsan");
        operations.set("id", "1", 15, TimeUnit.SECONDS);

        // 檢查存儲(chǔ)的值
        String username = operations.get("username");
        System.out.println("用戶名:" + username);
    }
}

以上代碼將usernameid存儲(chǔ)到Redis中,并設(shè)置了15秒的有效期。通過(guò)單元測(cè)試,可以直觀地驗(yàn)證Redis的寫入和有效期的功能是否正常工作。

4. 可能的擴(kuò)展與優(yōu)化

在實(shí)際應(yīng)用中,可以進(jìn)一步對(duì)該令牌失效機(jī)制進(jìn)行擴(kuò)展和優(yōu)化:

  • 基于用戶ID管理Token:可以在Redis中以userId為鍵,存儲(chǔ)用戶當(dāng)前的Token,這樣方便管理用戶的多個(gè)Token(如多設(shè)備登錄)。
  • 使用JWT(JSON Web Token):在Token中加入用戶的相關(guān)信息(如用戶ID、權(quán)限等),以減少對(duì)Redis的依賴。不過(guò)仍需在修改密碼等場(chǎng)景下失效Token。
  • 動(dòng)態(tài)調(diào)整Token有效期:可以根據(jù)用戶的活躍度或敏感操作動(dòng)態(tài)調(diào)整Token的過(guò)期時(shí)間,進(jìn)一步提高系統(tǒng)的靈活性。

結(jié)語(yǔ)

本文詳細(xì)介紹了基于Spring Boot和Redis實(shí)現(xiàn)令牌主動(dòng)失效機(jī)制的完整流程,并提供了關(guān)鍵代碼示例。通過(guò)將Token存儲(chǔ)在Redis中并在必要時(shí)主動(dòng)刪除,確保了用戶在修改密碼等操作后的Token立即失效,從而有效增強(qiáng)了系統(tǒng)的安全性。這種方案在實(shí)際開(kāi)發(fā)中具有良好的應(yīng)用價(jià)值。通過(guò)適當(dāng)擴(kuò)展和優(yōu)化,還可以滿足更復(fù)雜的業(yè)務(wù)需求,為用戶提供更優(yōu)質(zhì)的服務(wù)體驗(yàn)。

到此這篇關(guān)于SpringBoot與Redis的令牌主動(dòng)失效機(jī)制實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot Redis令牌主動(dòng)失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea啟動(dòng)命令過(guò)長(zhǎng)的問(wèn)題及解決

    idea啟動(dòng)命令過(guò)長(zhǎng)的問(wèn)題及解決

    當(dāng)IDEA啟動(dòng)命令過(guò)長(zhǎng)時(shí),可以通過(guò)修改workspace.xml文件或調(diào)整啟動(dòng)類配置來(lái)解決,方案一是在.idea文件或項(xiàng)目目錄中修改workspace.xml;方案二是通過(guò)運(yùn)行配置(run->edit)來(lái)保存啟動(dòng)設(shè)置,這兩種方法都可以有效縮短命令長(zhǎng)度,解決啟動(dòng)錯(cuò)誤
    2024-09-09
  • SpringBoot中EasyExcel實(shí)現(xiàn)Excel文件的導(dǎo)入導(dǎo)出

    SpringBoot中EasyExcel實(shí)現(xiàn)Excel文件的導(dǎo)入導(dǎo)出

    這篇文章主要介紹了SpringBoot中EasyExcel實(shí)現(xiàn)Excel文件的導(dǎo)入導(dǎo)出,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • idea 創(chuàng)建properties配置文件的步驟

    idea 創(chuàng)建properties配置文件的步驟

    這篇文章主要介紹了idea 創(chuàng)建properties配置文件的步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • SpringBoot依賴管理特性詳解

    SpringBoot依賴管理特性詳解

    Spring Boot自動(dòng)引入依賴的版本信息可以在`spring-boot-starter-parent`和`spring-boot-dependencies`的pom文件中找到,如果需要修改依賴版本,可以在項(xiàng)目pom文件中添加覆蓋配置項(xiàng)并刷新依賴即可
    2025-01-01
  • java web實(shí)現(xiàn)分頁(yè)查詢實(shí)例方法

    java web實(shí)現(xiàn)分頁(yè)查詢實(shí)例方法

    在本篇文章里我們給大家分享了java web實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)方法知識(shí)點(diǎn),有需要的朋友們參考學(xué)習(xí)下。
    2018-10-10
  • SpringBoot中使用Quartz管理定時(shí)任務(wù)的方法

    SpringBoot中使用Quartz管理定時(shí)任務(wù)的方法

    這篇文章主要介紹了SpringBoot中使用Quartz管理定時(shí)任務(wù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Springbean的幾種注入方式都了解嗎

    Springbean的幾種注入方式都了解嗎

    這篇文章主要介紹了Springbean的幾種注入方式都了解嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • spring注入在有常量的情況下使用@AllArgsConstructor操作

    spring注入在有常量的情況下使用@AllArgsConstructor操作

    這篇文章主要介紹了spring注入在有常量的情況下使用@AllArgsConstructor操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析

    hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析

    這篇文章主要介紹了hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 關(guān)于Java中的try-with-resources語(yǔ)句

    關(guān)于Java中的try-with-resources語(yǔ)句

    這篇文章主要介紹了關(guān)于Java中的try-with-resources語(yǔ)句,try-with-resources是Java中的環(huán)繞語(yǔ)句之一,旨在減輕開(kāi)發(fā)人員釋放try塊中使用的資源的義務(wù),需要的朋友可以參考下
    2023-05-05

最新評(píng)論