Spring Security內(nèi)存中認(rèn)證的實(shí)現(xiàn)
本文采用的是意譯的方式
在這篇 Spring Security 教程中,我們將學(xué)習(xí)如何配置 Spring Security,以實(shí)現(xiàn)在內(nèi)存認(rèn)證的功能。
概覽
Spring Security 中的 InMemoryUserDetailsManager 實(shí)現(xiàn)了 UserDetailsService,以提供存儲(chǔ)在內(nèi)存中的基于用戶名/密碼的身份驗(yàn)證。InMemoryUserDetailsManager 通過(guò)實(shí)現(xiàn) UserDetailsManager 接口提供對(duì) UserDetails 的管理功能。當(dāng) Spring Security 被配置為接受用戶名和密碼進(jìn)行身份驗(yàn)證時(shí),將使用基于 UserDetails 的身份驗(yàn)證。
譯者加:當(dāng)然,我們可以通過(guò)重寫(xiě) username 和 password 的方法更改驗(yàn)證的字段。比如將 username 返回值為 email。
Maven
在 Spring Boot 項(xiàng)目中使用 Spring Security,我們需要添加下面 Maven 依賴(lài):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
Spring Security 配置
接下來(lái),我們使用內(nèi)存認(rèn)證的方式配置 Spring Security。我們創(chuàng)建名為 SpringSecurityConfig 類(lèi),并添加下面代碼??
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SpringSecurityConfig { @Bean public static PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeHttpRequests((authorize) -> { authorize.anyRequest().authenticated(); }).httpBasic(Customizer.withDefaults()); return http.build(); } @Bean public UserDetailsService userDetailsService(){ UserDetails ramesh = User.builder() .username("ramesh") .password(passwordEncoder().encode("password")) .roles("USER") .build(); UserDetails admin = User.builder() .username("admin") .password(passwordEncoder().encode("admin")) .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(ramesh, admin); } }
在這里,我們使用了 httpBasic() 方法在 SecurityFilterChain bean 中定義了基本認(rèn)證。
@Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeHttpRequests((authorize) -> { authorize.anyRequest().authenticated(); }).httpBasic(Customizer.withDefaults()); return http.build(); }
在下面的 InMemoryUserDetailsManager 的 Java 配置中,我們創(chuàng)建了兩個(gè)用戶并且將其存放在 InMemoryUserDetailsManager 類(lèi)對(duì)象中。
@Bean public UserDetailsService userDetailsService(){ UserDetails ramesh = User.builder() .username("ramesh") .password(passwordEncoder().encode("password")) .roles("USER") .build(); UserDetails admin = User.builder() .username("admin") .password(passwordEncoder().encode("admin")) .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(ramesh, admin); }
Spring Security 的 InMemoryUserDetailsManager 通過(guò)實(shí)現(xiàn) UserDetailsService 接口,提供了基于用戶名/密碼的身份驗(yàn)證支持,這些驗(yàn)證信息存放在內(nèi)存中。
需要注意的是,我們使用 PasswordEncoder 來(lái)加密密碼。Spring Security 中的 PasswordEncoder 接口被用來(lái)對(duì)密碼進(jìn)行單向轉(zhuǎn)換,以確保密碼安全地存儲(chǔ)。我們使用的 BCryptPasswordEncoder 類(lèi)實(shí)現(xiàn)了 PasswordEncoder 接口。
BCryptPasswordEncoder 類(lèi)實(shí)現(xiàn)了 bcrypt 算法對(duì)密碼進(jìn)行哈希算法。
@Bean public static PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); }
.password(passwordEncoder().encode("password"))
創(chuàng)建 REST API
為了驗(yàn)證上面的 Spring Security 配置,我們創(chuàng)建一個(gè)基于 Spring Security 的簡(jiǎn)單 REST API。嗯,如果我們只是簡(jiǎn)單添加了 Spring Security 依賴(lài)到 Spring Boot 項(xiàng)目中,那么 Spring Security 會(huì)默認(rèn)保護(hù)程序的所有 URLs。
import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class WelComeController { @GetMapping("/greeting") public String greeting(Authentication authentication) { String userName = authentication.getName(); return "Spring Security In-memory Authentication Example - Welcome " + userName; } }
使用 Postman 測(cè)試 REST API
為了測(cè)試 REST APIs,我們?cè)陬^信息 basic authentication 中輸入用戶名和密碼。
截圖中,我們輸入了用戶名/密碼為 admin/admin:
總結(jié)
在這個(gè)教程中,我們學(xué)到了怎么配置 Spring Security 6 以在內(nèi)存中認(rèn)證。一言蔽之,我們使用了 Spring Security 的 InMemoryUserDetailsManager 類(lèi),該類(lèi)實(shí)現(xiàn)了 UserDetailsService,以提供在內(nèi)存中存儲(chǔ)用戶名/密碼的身份認(rèn)證支持。
到此這篇關(guān)于Spring Security內(nèi)存中認(rèn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Security內(nèi)存認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringSecurity?默認(rèn)登錄認(rèn)證的實(shí)現(xiàn)原理解析
- SpringSecurity實(shí)現(xiàn)權(quán)限認(rèn)證與授權(quán)的使用示例
- SpringBoot整合SpringSecurity認(rèn)證與授權(quán)
- SpringSecurity+jwt+redis基于數(shù)據(jù)庫(kù)登錄認(rèn)證的實(shí)現(xiàn)
- SpringSecurity身份認(rèn)證原理解析
- springsecurity第三方授權(quán)認(rèn)證的項(xiàng)目實(shí)踐
- Spring Security實(shí)現(xiàn)身份認(rèn)證和授權(quán)的示例代碼
- SpringSecurity實(shí)現(xiàn)前后端分離登錄token認(rèn)證詳解
- Spring Security認(rèn)證機(jī)制源碼層探究
- SpringBoot security安全認(rèn)證登錄的實(shí)現(xiàn)方法
- Spring Security添加二次認(rèn)證的項(xiàng)目實(shí)踐
相關(guān)文章
Spring boot中@Conditional和spring boot的自動(dòng)配置實(shí)例詳解
本文通過(guò)實(shí)例給大家介紹了Spring boot中@Conditional和spring boot的自動(dòng)配置,需要的朋友可以參考下2018-05-05基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解
這篇文章主要介紹了基于SpringBoot集成測(cè)試遠(yuǎn)程連接的Redis服務(wù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Java注冊(cè)郵箱激活驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要介紹了Java注冊(cè)郵箱激活驗(yàn)證實(shí)現(xiàn)代碼,有需要的朋友可以參考一下2013-12-12IDEA java出現(xiàn)無(wú)效的源發(fā)行版14解決方案
這篇文章主要介紹了IDEA java出現(xiàn)無(wú)效的源發(fā)行版14解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆紅的原因解讀
這篇文章主要介紹了Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆紅的原因解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05一步步講解Spring?Boot整合MyBatis與PostgreSQL實(shí)戰(zhàn)指南
這篇文章主要介紹了如何在SpringBoot環(huán)境中集成MyBatis和PostgreSQL,涵蓋了環(huán)境搭建、項(xiàng)目創(chuàng)建、數(shù)據(jù)源配置、實(shí)體類(lèi)與Mapper接口定義、MapperXML文件編寫(xiě)、業(yè)務(wù)層與控制層實(shí)現(xiàn)以及測(cè)試與驗(yàn)證的全過(guò)程,需要的朋友可以參考下2025-02-02Spring定時(shí)任務(wù)中@PostConstruct被多次執(zhí)行異常的分析與解決
這篇文章主要給大家介紹了關(guān)于Spring定時(shí)任務(wù)中@PostConstruct被多次執(zhí)行異常的分析與解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10Java實(shí)現(xiàn)簡(jiǎn)單銀行ATM功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)銀行ATM簡(jiǎn)單功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10