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

Java實(shí)現(xiàn)JWT 雙簽發(fā)認(rèn)證+RBAC權(quán)限的示例代碼

 更新時間:2025年08月24日 10:59:59   作者:hqxstudying  
本文主要介紹了Java實(shí)現(xiàn)JWT 雙簽發(fā)認(rèn)證+RBAC權(quán)限的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. JWT 雙簽發(fā)認(rèn)證基礎(chǔ)概念

JWT(JSON Web Token)是一種用于在網(wǎng)絡(luò)應(yīng)用間傳遞聲明的安全標(biāo)準(zhǔn)。雙簽發(fā)認(rèn)證指的是同時簽發(fā)訪問令牌(Access Token)和刷新令牌(Refresh Token):

  • Access Token:包含用戶身份和權(quán)限信息,有效期較短(如 15 分鐘)
  • Refresh Token:僅包含用戶身份信息,有效期較長(如 7 天)
  • 當(dāng) Access Token 過期時,使用 Refresh Token 重新獲取新的 Access Token

2. RBAC 權(quán)限模型基礎(chǔ)概念

RBAC(基于角色的訪問控制)是一種權(quán)限管理模型,核心組件包括:

  • 用戶(User):系統(tǒng)的使用者
  • 角色(Role):一組權(quán)限的集合(如管理員、用戶、訪客)
  • 權(quán)限(Permission):對資源的操作許可(如創(chuàng)建文章、刪除用戶)
  • 用戶 - 角色關(guān)聯(lián):一個用戶可以擁有多個角色
  • 角色 - 權(quán)限關(guān)聯(lián):一個角色可以包含多個權(quán)限

3. Java 項(xiàng)目中實(shí)現(xiàn) JWT 雙簽發(fā)認(rèn)證

以下是一個簡單的 Java 實(shí)現(xiàn)示例,使用 Spring Security 和 JJWT 庫:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
 
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
 
@Component
public class JwtUtil {
    private static final String SECRET_KEY = "your-secret-key";
    private static final long ACCESS_TOKEN_VALIDITY = 15 * 60 * 1000; // 15分鐘
    private static final long REFRESH_TOKEN_VALIDITY = 7 * 24 * 60 * 60 * 1000; // 7天
 
    // 生成訪問令牌
    public String generateAccessToken(String username, String roles) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("roles", roles);
        return createToken(claims, username, ACCESS_TOKEN_VALIDITY);
    }
 
    // 生成刷新令牌
    public String generateRefreshToken(String username) {
        return createToken(new HashMap<>(), username, REFRESH_TOKEN_VALIDITY);
    }
 
    private String createToken(Map<String, Object> claims, String subject, long validity) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + validity))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }
 
    // 驗(yàn)證令牌
    public Boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
 
    // 從令牌中獲取用戶名
    public String getUsernameFromToken(String token) {
        return getClaimFromToken(token, Claims::getSubject);
    }
 
    // 從令牌中獲取角色
    public String getRolesFromToken(String token) {
        return (String) getAllClaimsFromToken(token).get("roles");
    }
 
    private <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = getAllClaimsFromToken(token);
        return claimsResolver.apply(claims);
    }
 
    private Claims getAllClaimsFromToken(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }
}

4. Java 項(xiàng)目中實(shí)現(xiàn) RBAC 權(quán)限控制

下面是一個基于 Spring Security 的 RBAC 實(shí)現(xiàn)示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
@Configuration
@EnableWebSecurity
public class SecurityConfig {
 
    private final JwtRequestFilter jwtRequestFilter;
 
    public SecurityConfig(JwtRequestFilter jwtRequestFilter) {
        this.jwtRequestFilter = jwtRequestFilter;
    }
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/auth/**").permitAll() // 認(rèn)證接口不需要權(quán)限
                .antMatchers("/api/admin/**").hasRole("ADMIN") // 需要ADMIN角色
                .antMatchers("/api/user/**").hasAnyRole("ADMIN", "USER") // 需要ADMIN或USER角色
                .anyRequest().authenticated()
                .and()
            .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
        
        return http.build();
    }
}

5. 數(shù)據(jù)庫五層設(shè)計方案

一個完整的 RBAC 系統(tǒng)數(shù)據(jù)庫設(shè)計通常包含以下五層:

第一層:用戶層

CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    status TINYINT NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

第二層:角色層

CREATE TABLE roles (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    role_name VARCHAR(50) UNIQUE NOT NULL,
    description VARCHAR(255),
    status TINYINT NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

第三層:權(quán)限層

CREATE TABLE permissions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    permission_name VARCHAR(50) UNIQUE NOT NULL,
    description VARCHAR(255),
    status TINYINT NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

第四層:關(guān)聯(lián)層

-- 用戶-角色關(guān)聯(lián)表
CREATE TABLE user_roles (
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id)
);
 
-- 角色-權(quán)限關(guān)聯(lián)表
CREATE TABLE role_permissions (
    role_id BIGINT NOT NULL,
    permission_id BIGINT NOT NULL,
    PRIMARY KEY (role_id, permission_id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    FOREIGN KEY (permission_id) REFERENCES permissions(id)
);

第五層:資源層(可選,用于更細(xì)粒度控制)

CREATE TABLE resources (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    resource_name VARCHAR(50) UNIQUE NOT NULL,
    resource_type VARCHAR(50) NOT NULL,
    parent_id BIGINT,
    url VARCHAR(255),
    status TINYINT NOT NULL DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (parent_id) REFERENCES resources(id)
);
 
-- 權(quán)限-資源關(guān)聯(lián)表
CREATE TABLE permission_resources (
    permission_id BIGINT NOT NULL,
    resource_id BIGINT NOT NULL,
    actions VARCHAR(100) NOT NULL, -- 如: "create,read,update,delete"
    PRIMARY KEY (permission_id, resource_id),
    FOREIGN KEY (permission_id) REFERENCES permissions(id),
    FOREIGN KEY (resource_id) REFERENCES resources(id)
);

6. 實(shí)現(xiàn)流程示例

以下是一個典型的認(rèn)證授權(quán)流程:

  1. 用戶登錄,驗(yàn)證用戶名密碼
  2. 驗(yàn)證成功后,生成 Access Token 和 Refresh Token
  3. 將兩個 Token 返回給客戶端
  4. 客戶端在請求頭中攜帶 Access Token
  5. 服務(wù)端驗(yàn)證 Access Token 有效性
  6. 若 Access Token 過期,客戶端使用 Refresh Token 請求新的 Access Token
  7. 服務(wù)端驗(yàn)證 Refresh Token,生成新的 Access Token 和 Refresh Token
  8. 服務(wù)端根據(jù) Token 中的角色信息,結(jié)合 RBAC 權(quán)限控制進(jìn)行訪問控制

7. 安全增強(qiáng)建議

  1. Refresh Token 存儲安全

    • 考慮將 Refresh Token 存儲在 HttpOnly Cookie 中,防止 XSS 攻擊
    • 對 Refresh Token 實(shí)現(xiàn)嚴(yán)格的同源策略
  2. Token 泄露防護(hù)

    • 實(shí)現(xiàn) Token 撤銷機(jī)制
    • 為每個用戶維護(hù)一個唯一的設(shè)備標(biāo)識
    • 實(shí)現(xiàn)異常登錄檢測和通知
  3. 權(quán)限設(shè)計最佳實(shí)踐

    • 遵循最小權(quán)限原則
    • 定期審查和清理過時角色和權(quán)限
    • 實(shí)現(xiàn)權(quán)限繼承和權(quán)限組

到此這篇關(guān)于Java實(shí)現(xiàn)JWT 雙簽發(fā)認(rèn)證+RBAC權(quán)限的示例代碼的文章就介紹到這了,更多相關(guān)Java JWT 雙簽發(fā)認(rèn)證+RBAC權(quán)限內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • dubbo服務(wù)整合zipkin詳解

    dubbo服務(wù)整合zipkin詳解

    這篇文章主要介紹了dubbo服務(wù)整合zipkin,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java實(shí)現(xiàn)提取不重復(fù)的整數(shù)實(shí)例

    Java實(shí)現(xiàn)提取不重復(fù)的整數(shù)實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)提取不重復(fù)的整數(shù)實(shí)例,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Java中的StringJoiner類使用示例深入詳解

    Java中的StringJoiner類使用示例深入詳解

    這篇文章主要為大家介紹了Java中的StringJoiner類使用示例深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java解析Excel內(nèi)容的方法

    Java解析Excel內(nèi)容的方法

    這篇文章主要介紹了Java解析Excel內(nèi)容的方法,實(shí)例分析了java解析excel文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 淺談Java代理(jdk靜態(tài)代理、動態(tài)代理和cglib動態(tài)代理)

    淺談Java代理(jdk靜態(tài)代理、動態(tài)代理和cglib動態(tài)代理)

    下面小編就為大家?guī)硪黄獪\談Java代理(jdk靜態(tài)代理、動態(tài)代理和cglib動態(tài)代理)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java模擬實(shí)現(xiàn)斗地主發(fā)牌

    Java模擬實(shí)現(xiàn)斗地主發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)模擬斗地主發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 關(guān)于idea-web.xml版本過低怎么生成新的(web.xml報錯)問題

    關(guān)于idea-web.xml版本過低怎么生成新的(web.xml報錯)問題

    今天通過本文給大家分享idea-web.xml版本過低怎么生成新的(web.xml報錯)問題,通過更換web.xml版本解決此問題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 詳解springBoot啟動時找不到或無法加載主類解決辦法

    詳解springBoot啟動時找不到或無法加載主類解決辦法

    這篇文章主要介紹了詳解springBoot啟動時找不到或無法加載主類解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧大全

    Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧大全

    在Java中QueryWrapper是MyBatis-Plus框架中的一個查詢構(gòu)造器,它提供了豐富的查詢方法,其中包括and和or方法,可以用于構(gòu)建復(fù)雜的查詢條件,這篇文章主要給大家介紹了關(guān)于Java?MyBatis實(shí)戰(zhàn)之QueryWrapper中and和or拼接技巧的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java 敏感信息加密處理

    Java 敏感信息加密處理

    本文主要介紹了Java 敏感信息加密處理的相關(guān)知識:1)敏感信息加密處理我們要實(shí)現(xiàn)什么;2)敏感信息加密處理我做了些什么;3)敏感信息加密實(shí)現(xiàn)方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-03-03

最新評論