亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
2。使用JWT進(jìn)行基於令牌的身份驗(yàn)證
實(shí)施JWT的步驟:
3。截?cái)嗪万?yàn)證JWT的自定義過(guò)濾器
4。具有適當(dāng)基於角色的訪問(wèn)的安全端點(diǎn)
概括
首頁(yè) Java java教程 使用Spring Security在Java中固定REST API

使用Spring Security在Java中固定REST API

Jul 28, 2025 am 03:08 AM
java

禁用CSRF並將會(huì)話創(chuàng)建策略禁用到SecurityConfig中的無(wú)狀態(tài),以確保不創(chuàng)建會(huì)話; 2。使用JWT在登錄後生成簽名令牌並將其返回客戶端,將JWT用於基於令牌的身份驗(yàn)證; 3.在自定義過(guò)濾器(JWTAUTHFILTER)中驗(yàn)證JWT,該jwt從授權(quán)標(biāo)頭中提取令牌並在安全上下文中設(shè)置身份驗(yàn)證; 4。使用基於角色的訪問(wèn)控制器或通過(guò)請(qǐng)求匹配器或方法級(jí)註釋(例如@preauthorize)使用基於角色的訪問(wèn)控制的安全端點(diǎn); 5。遵循最佳實(shí)踐,包括使用HTTP,短壽命令牌,刷新令牌,限制速率以及避免將令牌日誌記錄以提高安全性。這種方法可確保借助Spring Security在Java中的安全,無(wú)狀態(tài)和可擴(kuò)展的REST API。

使用Spring Security在Java中固定REST API

使用彈簧安全性在Java中確保REST API是現(xiàn)代Web應(yīng)用程序的普遍要求。由於REST API是根據(jù)設(shè)計(jì)無(wú)狀態(tài)的,因此基於會(huì)話的安全性不太合適。但是,Spring Security提供了靈活的工具,可以有效地保護(hù)REST端點(diǎn),尤其是與JWT(JSON Web令牌)(JSON Web令牌)(JSON Web令牌)(例如JON)結(jié)合使用時(shí)。

使用Spring Security在Java中固定REST API

這是使用Spring Security在Java中正確保護(hù)Java中的REST API的方法:


1。禁用CSRF並啟用無(wú)狀態(tài)身份驗(yàn)證

REST API通常被前端應(yīng)用程序,移動(dòng)客戶端或第三方服務(wù)所消費(fèi),而不是依靠Cookie的瀏覽器。因此,CSRF保護(hù)是不必要的,可以乾擾API呼叫。

使用Spring Security在Java中固定REST API

在您的SecurityConfig中,禁用CSRF並將會(huì)話策略設(shè)置為無(wú)狀態(tài)

 @配置
@enablewebsecurity
公共類SecurityConfig {

    @豆
    公共安全縮鏈過(guò)濾鏈(HTTPSECURITY HTTP)拋出異常{
        http
            .csrf()。 disable()//無(wú)狀態(tài)API不需要
            。
            。和()
            .authorizeHttpRequests(authz -> authz
                .RequestMatchers(“/api/public/**”)。許可證()
                .requestMatchers(“/api/admin/**”)。哈斯羅爾(“ admin”)
                .anyRequest()。驗(yàn)證()
            )
            .httpbasic()。 disable()//優(yōu)於基於令牌而不是基本auth
            。

        返回http.build();
    }

    @豆
    公共AuthenticationManager AuthenticationManager(
            authentication configuration authconfig)拋出異常{
        返回authconfig.getAuthenticationManager();
    }

    @豆
    公共jwtauthfilter jwtauthfilter(){
        返回新的jwtauthfilter();
    }
}

?關(guān)鍵點(diǎn):使用SessionCreationPolicy.STATELESS ,以使Spring不會(huì)創(chuàng)建或使用HTTP會(huì)話。

使用Spring Security在Java中固定REST API

2。使用JWT進(jìn)行基於令牌的身份驗(yàn)證

JWT是代表當(dāng)事方之間索賠的緊湊,安全的方式。它是REST API的理想選擇,因?yàn)樗鼣y帶用戶信息並且是獨(dú)立的。

實(shí)施JWT的步驟:

  • 生成令牌:成功登錄後,生成一個(gè)包含用戶詳細(xì)信息的JWT(例如,用戶名,角色)。
  • 發(fā)送令牌:在響應(yīng)中返回(通常在JSON主體或Authorization標(biāo)頭中)。
  • 驗(yàn)證令牌:根據(jù)每個(gè)請(qǐng)求,請(qǐng)從Authorization: Bearer <token>標(biāo)題。

簡(jiǎn)單的JwtUtil類的示例:

 @成分
公共類Jwtutil {
    私有字符串秘密=“ yoursepretkey”; //使用環(huán)境中的強(qiáng)鍵
    私人int expry = 86400; // 24小時(shí)

    public String generateToken(userDetails userDetails){
        MAP <String,Object> sippers = new Hashmap <>();
        返回jwts.builder()
                .setClaims(索賠)
                。
                .setissuedat(new Date())
                .setExpiration(new Date(System.CurrentTimeMillis()到期 * 1000)
                。
                。袖珍的();
    }

    public boolean istokenValid(字符串令牌,字符串用戶名){
        返回getUsernamefromtoken(token).equals(用戶名)&&! istokenexpired(token);
    }

    公共字符串getUsernamefromtoken(字符串令牌){
        返回getClaim(token,索賠:: getSubject);
    }

    private <t> t getClaim(字符串令牌,function <聲明,t>解析器){
        索賠索賠= jwts.parser()
                .setsigningkey(秘密)
                .parseclaimsjws(令牌)
                .getBody();
        返回resolver.apply(索賠);
    }

    私有布爾iStokenexpired(字符串令牌){
        返回getClaim(token,索賠:: getExpiration).before(new Date());
    }
}

??從不使用生產(chǎn)中的秘密密鑰 - 使用環(huán)境變量或秘密經(jīng)理。


3。截?cái)嗪万?yàn)證JWT的自定義過(guò)濾器

創(chuàng)建一個(gè)在主要身份驗(yàn)證鏈之前運(yùn)行的過(guò)濾器,以檢查請(qǐng)求標(biāo)題中的JWT。

 @成分
公共類Jwtauthfilter曾經(jīng)擴(kuò)展一次

    @Autowired
    私有userDetailsservice userDetailsservice;

    @Autowired
    私人jwtutil jwtutil;

    @Override
    受保護(hù)的void doferterinternal(httpservletrequest請(qǐng)求,
                                    httpservletresponse響應(yīng),
                                    過(guò)濾鍊鍊)拋出ServletException,ioexception {

        最終字符串標(biāo)題= request.getheader(“授權(quán)”);
        字符串jwt = null;
        字符串用戶名= null;

        if(header!= null && header.startswith(“ bearer”)){
            jwt = header.substring(7);
            嘗試 {
                用戶名= jwtutil.getusernamefromtoken(jwt);
            } catch(異常E){
                //無(wú)效的令牌
            }
        }

        if(username!= null && securityContexTholder.getContext()。getAuthentication()== null){
            userDetails userDetails = userDetailsservice.loaduserbyusername(用戶名);
            if(jwtutil.istokenvalid(jwt,userdetails.getusername())){
                usernamepasswordauthentication token authtoken =
                        新的USERNAMEPASSWORDAUTHENTICATION(USERDETAILS,null,userDetails.getAuthorities());
                authtoken.setDetails(new WebAuthenticationDetailsSource()。buildDetails(request));
                securityContexTholder.getContext()。 setAuthentication(authtoken);
            }
        }

        Chain.Dofter(請(qǐng)求,響應(yīng));
    }
}

此過(guò)濾器:

  • Authorization標(biāo)頭中提取令牌。
  • 解析並驗(yàn)證它。
  • 加載用戶並將身份驗(yàn)證設(shè)置在安全上下文中。

4。具有適當(dāng)基於角色的訪問(wèn)的安全端點(diǎn)

使用彈簧安全註釋保護(hù)方法或端點(diǎn):

 @RestController
@requestmapping(“/api/admin”)
@preauthorize(“ hasrole(&#39;admin&#39;)”)
公共類AdminController {

    @getMapping(“/用戶”)
    公共列表<user> getallusers(){
        //只能訪問(wèn)管理
    }
}

啟用方法級(jí)安全性:

 @配置
@enableglobalmethodsecurity(prepostenabled = true)
公共類MethodsecurityConfig {
    //無(wú)需其他配置
}

5。其他安全最佳實(shí)踐

  • ?使用https :始終將API通過(guò)HTTPS提供,以保護(hù)運(yùn)輸中的令牌。
  • ?設(shè)置簡(jiǎn)短的令牌到期:如果一個(gè)令牌被盜,請(qǐng)減少暴露窗口。
  • ?刷新令牌:使用刷新代幣機(jī)制重新發(fā)行訪問(wèn)令牌而無(wú)需重新發(fā)行。
  • ?費(fèi)率限制:使用Bucket4jSpring Cloud Gateway等工具防止蠻力攻擊。
  • ?避免日誌記錄令牌:確保不會(huì)在服務(wù)器日誌中偶然登錄令牌。

概括

用彈簧安全保護(hù)在Java中保護(hù)REST API:

  • 禁用CSRF並使用無(wú)狀態(tài)會(huì)議。
  • 使用JWT進(jìn)行身份驗(yàn)證而不是會(huì)話。
  • 通過(guò)自定義過(guò)濾器驗(yàn)證令牌。
  • 使用方法或路徑級(jí)安全性執(zhí)行訪問(wèn)控制。
  • 遵循安全性最佳實(shí)踐(HTTPS,短壽命令等)。

使用此設(shè)置,您的REST API既安全又可擴(kuò)展 - 用於SPA,移動(dòng)應(yīng)用或微服務(wù)的完美。

基本上,一旦獲得流程,它就不復(fù)雜了:驗(yàn)證一次,獲得一個(gè)令牌,並在沒(méi)有會(huì)話的情況下證明身份。

以上是使用Spring Security在Java中固定REST API的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

用雅加達(dá)EE在Java建立靜止的API 用雅加達(dá)EE在Java建立靜止的API Jul 30, 2025 am 03:05 AM

SetupaMaven/GradleprojectwithJAX-RSdependencieslikeJersey;2.CreateaRESTresourceusingannotationssuchas@Pathand@GET;3.ConfiguretheapplicationviaApplicationsubclassorweb.xml;4.AddJacksonforJSONbindingbyincludingjersey-media-json-jackson;5.DeploytoaJakar

Java項(xiàng)目管理Maven的開發(fā)人員指南 Java項(xiàng)目管理Maven的開發(fā)人員指南 Jul 30, 2025 am 02:41 AM

Maven是Java項(xiàng)目管理和構(gòu)建的標(biāo)準(zhǔn)工具,答案在於它通過(guò)pom.xml實(shí)現(xiàn)項(xiàng)目結(jié)構(gòu)標(biāo)準(zhǔn)化、依賴管理、構(gòu)建生命週期自動(dòng)化和插件擴(kuò)展;1.使用pom.xml定義groupId、artifactId、version和dependencies;2.掌握核心命令如mvnclean、compile、test、package、install和deploy;3.利用dependencyManagement和exclusions管理依賴版本與衝突;4.通過(guò)多模塊項(xiàng)目結(jié)構(gòu)組織大型應(yīng)用並由父POM統(tǒng)一管理;5.配

CSS暗模式切換示例 CSS暗模式切換示例 Jul 30, 2025 am 05:28 AM

首先通過(guò)JavaScript獲取用戶系統(tǒng)偏好和本地存儲(chǔ)的主題設(shè)置,初始化頁(yè)面主題;1.HTML結(jié)構(gòu)包含一個(gè)按鈕用於觸發(fā)主題切換;2.CSS使用:root定義亮色主題變量,.dark-mode類定義暗色主題變量,並通過(guò)var()應(yīng)用這些變量;3.JavaScript檢測(cè)prefers-color-scheme並讀取localStorage決定初始主題;4.點(diǎn)擊按鈕時(shí)切換html元素上的dark-mode類,並將當(dāng)前狀態(tài)保存至localStorage;5.所有顏色變化均帶有0.3秒過(guò)渡動(dòng)畫,提升用戶

CSS下拉菜單示例 CSS下拉菜單示例 Jul 30, 2025 am 05:36 AM

是的,一個(gè)常見的CSS下拉菜單可以通過(guò)純HTML和CSS實(shí)現(xiàn),無(wú)需JavaScript。 1.使用嵌套的ul和li構(gòu)建菜單結(jié)構(gòu);2.通過(guò):hover偽類控制下拉內(nèi)容的顯示與隱藏;3.父級(jí)li設(shè)置position:relative,子菜單使用position:absolute進(jìn)行定位;4.子菜單默認(rèn)display:none,懸停時(shí)變?yōu)閐isplay:block;5.可通過(guò)嵌套實(shí)現(xiàn)多級(jí)下拉,結(jié)合transition添加淡入動(dòng)畫,配合媒體查詢適配移動(dòng)端,整個(gè)方案簡(jiǎn)潔且無(wú)需JavaScript支持,適合大

如何將Java MistageDigest用於哈希(MD5,SHA-256)? 如何將Java MistageDigest用於哈希(MD5,SHA-256)? Jul 30, 2025 am 02:58 AM

要使用Java生成哈希值,可通過(guò)MessageDigest類實(shí)現(xiàn)。 1.獲取指定算法的實(shí)例,如MD5或SHA-256;2.調(diào)用.update()方法傳入待加密數(shù)據(jù);3.調(diào)用.digest()方法獲取哈希字節(jié)數(shù)組;4.將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)製字符串以便讀??;對(duì)於大文件等輸入,應(yīng)分塊讀取並多次調(diào)用.update();推薦使用SHA-256而非MD5或SHA-1以確保安全性。

Python Parse Date String示例 Python Parse Date String示例 Jul 30, 2025 am 03:32 AM

使用datetime.strptime()可將日期字符串轉(zhuǎn)換為datetime對(duì)象,1.基本用法:通過(guò)"%Y-%m-%d"解析"2023-10-05"為datetime對(duì)象;2.支持多種格式如"%m/%d/%Y"解析美式日期、"%d/%m/%Y"解析英式日期、"%b%d,%Y%I:%M%p"解析帶AM/PM的時(shí)間;3.可用dateutil.parser.parse()自動(dòng)推斷未知格式;4.使用.d

VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

崇高文本自動(dòng)關(guān)閉HTML標(biāo)籤 崇高文本自動(dòng)關(guān)閉HTML標(biāo)籤 Jul 30, 2025 am 02:41 AM

安裝Emmet插件可實(shí)現(xiàn)智能自動(dòng)閉合標(biāo)籤並支持縮寫語(yǔ)法;2.啟用"auto_match_enabled":true讓Sublime自動(dòng)補(bǔ)全簡(jiǎn)單標(biāo)籤;3.使用Alt .(Win)或Ctrl Shift .(Mac)快捷鍵手動(dòng)閉合當(dāng)前標(biāo)籤——推薦日常使用Emmet,輕量需求可用後兩種方式組合,效率足夠且設(shè)置簡(jiǎn)單。

See all articles