亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

springboot依靠security實(shí)現(xiàn)digest認(rèn)證的實(shí)踐

 更新時(shí)間:2025年09月28日 15:15:39   作者:knight郭志斌  
HTTP摘要認(rèn)證通過(guò)加密參數(shù)(如nonce、response)驗(yàn)證身份,避免明文傳輸,但存在密碼存儲(chǔ)風(fēng)險(xiǎn),相比基本認(rèn)證更安全,卻因?qū)崿F(xiàn)復(fù)雜且不支持Remember-me,未被廣泛采用,測(cè)試案例顯示其工作流程

概述

HTTP 摘要認(rèn)證使用對(duì)通信雙方都可知的口令進(jìn)行校驗(yàn),最終的傳輸數(shù)據(jù)并非明文形式。

HTTP 摘要基本認(rèn)證意在解決 HTTP 基本認(rèn)證存在的大部分嚴(yán)重漏洞,但不應(yīng)將其認(rèn)為是Web安全的最終解決方案。

參數(shù)

HTTP摘要認(rèn)證的回應(yīng)與HTTP基本認(rèn)證相比要復(fù)雜得多,下面看看HTTP摘要認(rèn)證中涉及的一些參數(shù):

  • username:用戶名。
  • password:用戶密碼。
  • realm:認(rèn)證域,由服務(wù)器返回。
  • opaque:透?jìng)髯址?,客戶端?yīng)原樣返回。
  • method:請(qǐng)求的方法。
  • nonce:由服務(wù)器生成的隨機(jī)字符串。
  • nc:即nonce-count,指請(qǐng)求的次數(shù),用于計(jì)數(shù),防止重放攻擊。qop被指定時(shí),nc也必須被指定。
  • cnonce:客戶端發(fā)給服務(wù)器的隨機(jī)字符串,qop被指定時(shí),cnonce也必須被指定。
  • qop:保護(hù)級(jí)別,客戶端根據(jù)此參數(shù)指定摘要算法。若取值為auth,則只進(jìn)行身份驗(yàn)證;若取值為auth-int,則還需要校驗(yàn)內(nèi)容完整性。
  • uri:請(qǐng)求的uri。
  • response:客戶端根據(jù)算法算出的摘要值。
  • algorithm:摘要算法,目前僅支持MD5。
  • entity-body:頁(yè)面實(shí)體,非消息實(shí)體,僅在auth-int中支持。

通常服務(wù)器攜帶的數(shù)據(jù)包括realm、opaque、nonce、qop等字段,如果客戶端需要做出驗(yàn)證回應(yīng),就必須按照一定的算法計(jì)算得到一些新的數(shù)據(jù)并一起返回。

總結(jié):

  • HTTP摘要認(rèn)證與HTTP基本認(rèn)證一樣,都是基于HTTP層面的認(rèn)證方式,不使用session,因而不支持Remember-me。
  • 雖然解決了HTTP基本認(rèn)證密碼明文傳輸?shù)膯栴},但并未解決密碼明文存儲(chǔ)的問題,依然存在安全隱患。
  • HTTP 摘要認(rèn)證與 HTTP 基本認(rèn)證相比,僅僅在非加密的傳輸層中有安全優(yōu)勢(shì),但是其相對(duì)復(fù)雜的實(shí)現(xiàn)流程,使得它并不能成為一種被廣泛使用的認(rèn)證方式。

Demo

pom.xml依賴

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 測(cè)試包,當(dāng)我們使用 mvn package 的時(shí)候該包并不會(huì)被打入,因?yàn)樗纳芷谥辉?test 之內(nèi)-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

Digest1Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author gzb
 */
@RestController
@SpringBootApplication
public class Digest1Application {

    public static void main(String[] args) {
        SpringApplication.run(Digest1Application.class, args);
    }

    @GetMapping("/demo1")
    public String demo1() {
        return "Hello battcn";
    }

}

MyPasswordEncoder.java

import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * @author gzb
 * @date 2021/10/1315:06
 */
@Component
public class MyPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return s.equals(charSequence.toString());
    }
}

WebSecurityConfig.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint;
import org.springframework.security.web.authentication.www.DigestAuthenticationFilter;

/**
 * @author gzb
 * @date 2021/10/1313:41
 */
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private DigestAuthenticationEntryPoint myDigestEntryPoint;
    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public DigestAuthenticationEntryPoint digestEntryPoint() {
        DigestAuthenticationEntryPoint digestAuthenticationEntryPoint = new DigestAuthenticationEntryPoint();
        digestAuthenticationEntryPoint.setKey("https://blog.csdn.net/zhanwuguo8346");
        digestAuthenticationEntryPoint.setRealmName("spring security");
        digestAuthenticationEntryPoint.setNonceValiditySeconds(500);
        return digestAuthenticationEntryPoint;
    }

    public DigestAuthenticationFilter digestAuthenticationFilter() {
        DigestAuthenticationFilter filter = new DigestAuthenticationFilter();
        filter.setAuthenticationEntryPoint(myDigestEntryPoint);
        filter.setUserDetailsService(userDetailsService);
        return filter;
    }

    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .csrf().disable()
                .exceptionHandling().authenticationEntryPoint(myDigestEntryPoint)
                .and()
                .addFilter(digestAuthenticationFilter());
    }
}

application.properties

server.port=9090
server.servlet.context-path=/ditest

spring.security.user.name=name
spring.security.user.password=password

測(cè)試

  • 瀏覽器F12打開開發(fā)者界面
  • 啟動(dòng)項(xiàng)目,瀏覽器訪問:http://localhost:9090/ditest/demo1
  • 輸入用戶名、密碼:name、password
  • 界面返回:Hello battcn

查看請(qǐng)求數(shù)據(jù):

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java創(chuàng)建線程的五種寫法總結(jié)

    Java創(chuàng)建線程的五種寫法總結(jié)

    本文主要為大家詳細(xì)介紹一下Java實(shí)現(xiàn)線程創(chuàng)建的五種寫法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,感興趣的可以跟隨小編學(xué)習(xí)一下
    2022-08-08
  • java語(yǔ)言中封裝類代碼示例

    java語(yǔ)言中封裝類代碼示例

    這篇文章主要介紹了java語(yǔ)言中封裝類,涉及相關(guān)代碼示例及結(jié)果分析,以及封裝的好處簡(jiǎn)單介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java操作pdf的工具類itext的處理方法

    Java操作pdf的工具類itext的處理方法

    這篇文章主要介紹了Java操作pdf的工具類itext,iText是一種生成PDF報(bào)表的Java組件,通過(guò)在服務(wù)器端使用Jsp或JavaBean生成PDF報(bào)表,客戶端采用超鏈接顯示或下載得到生成的報(bào)表,需要的朋友可以參考下
    2022-04-04
  • JavaWeb利用郵箱幫用戶找回密碼

    JavaWeb利用郵箱幫用戶找回密碼

    這篇文章主要為大家詳細(xì)介紹了JavaWeb利用郵箱幫用戶找回密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • JPA中@ElementCollection使用示例詳解

    JPA中@ElementCollection使用示例詳解

    在JPA中,@ElementCollection注解主要用于映射集合屬性,例如List、Set或數(shù)組等集合屬性,以及Map結(jié)構(gòu)的集合屬性,每個(gè)屬性值都有對(duì)應(yīng)的key映射,這篇文章主要介紹了JPA中@ElementCollection使用,需要的朋友可以參考下
    2023-11-11
  • java中的反射及其優(yōu)點(diǎn)說(shuō)明

    java中的反射及其優(yōu)點(diǎn)說(shuō)明

    這篇文章主要介紹了java中的反射及其優(yōu)點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • JUnit4 Hamcrest匹配器常用方法總結(jié)

    JUnit4 Hamcrest匹配器常用方法總結(jié)

    這篇文章主要介紹了JUnit4 Hamcrest匹配器常用方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    驗(yàn)證碼登錄是非常常見的一種登錄方式,能夠簡(jiǎn)化用戶登錄的過(guò)程,本文主要介紹了SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • JVM中ClassLoader類加載器的深入理解

    JVM中ClassLoader類加載器的深入理解

    這篇文章主要給大家介紹了關(guān)于JVM中ClassLoader類加載器的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼

    使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)示例代碼

    這篇文章主要介紹了使用Java實(shí)現(xiàn)MapReduce詞頻統(tǒng)計(jì)的相關(guān)資料,通過(guò)詞頻統(tǒng)計(jì)示例來(lái)展示MapReduce的運(yùn)行機(jī)制,涵蓋了Mapper和Reducer的實(shí)現(xiàn),并說(shuō)明了如何配置和執(zhí)行MapReduce作業(yè),需要的朋友可以參考下
    2024-11-11

最新評(píng)論