最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最新Spring Security的基于內(nèi)存用戶認(rèn)證方式

 更新時(shí)間:2025年07月28日 14:40:20   作者:Micro麥可樂(lè)  
本文講解SpringSecurity內(nèi)存認(rèn)證配置,適用于開(kāi)發(fā)、測(cè)試等場(chǎng)景,通過(guò)代碼創(chuàng)建用戶及權(quán)限管理,支持密碼加密,雖簡(jiǎn)單但不持久化,生產(chǎn)環(huán)境推薦使用數(shù)據(jù)庫(kù)或JWT等認(rèn)證方式,感興趣的朋友一起看看吧

1. 前言

又是新的一周,博主繼續(xù)來(lái)給大家更新 Spring Security 實(shí)戰(zhàn)教程了,在上一個(gè)章節(jié)中我們?cè)敿?xì)介紹了 Spring Security 的底層原理,本章節(jié)博主將帶著大家介紹如何在 Spring Security 中實(shí)現(xiàn)基于內(nèi)存的用戶認(rèn)證。

雖然 Spring Security 基于內(nèi)存的用戶認(rèn)證,實(shí)際開(kāi)發(fā)來(lái)說(shuō)相對(duì)來(lái)說(shuō)用的比較少,但某些場(chǎng)景下(如:開(kāi)發(fā)階段、原型驗(yàn)證、演示環(huán)境搭建、單元測(cè)試/集成測(cè)試、或甚至不需要數(shù)據(jù)庫(kù)的簡(jiǎn)單系統(tǒng)),基于內(nèi)存的用戶認(rèn)證方式就足以滿足需求,為了應(yīng)對(duì)這樣需求,博主覺(jué)得還是要必要聊一聊基于內(nèi)存的用戶認(rèn)證。

2. 因何選擇內(nèi)存認(rèn)證?

就如前面說(shuō)的場(chǎng)景,總結(jié)內(nèi)存認(rèn)證主要有以下幾個(gè)優(yōu)點(diǎn):

  • 簡(jiǎn)單快捷:配置簡(jiǎn)單,不需要依賴數(shù)據(jù)庫(kù)或外部存儲(chǔ),適用于快速構(gòu)建和測(cè)試。
  • 易于調(diào)試:所有用戶信息存儲(chǔ)在代碼中,方便開(kāi)發(fā)過(guò)程中快速定位問(wèn)題。
  • 適用于小型應(yīng)用:對(duì)于用戶數(shù)量較少的應(yīng)用或者臨時(shí)驗(yàn)證原型,內(nèi)存認(rèn)證是個(gè)不錯(cuò)的選擇

當(dāng)然,內(nèi)存認(rèn)證也有局限性:用戶數(shù)據(jù)不持久化、無(wú)法擴(kuò)展到分布式系統(tǒng)等。因此,在生產(chǎn)環(huán)境中,通常會(huì)采用基于數(shù)據(jù)庫(kù)或其他外部認(rèn)證機(jī)制的方式。

與數(shù)據(jù)庫(kù)認(rèn)證對(duì)比

特性內(nèi)存認(rèn)證數(shù)據(jù)庫(kù)認(rèn)證
用戶存儲(chǔ)位置應(yīng)用內(nèi)存持久化存儲(chǔ)
用戶管理靈活性配置硬編碼動(dòng)態(tài)增刪改查
生產(chǎn)環(huán)境適用性不推薦推薦

3. 基礎(chǔ)配置實(shí)戰(zhàn)

接下來(lái)在之前的Maven項(xiàng)目中還是創(chuàng)建第三個(gè)子模塊 memory-spring-security ,完整的maven項(xiàng)目結(jié)構(gòu)如下:

? 創(chuàng)建Spring Security配置文件

現(xiàn)在我們來(lái)創(chuàng)建一個(gè)Spring Security 配置文件 InMemorySecurityConfig

@Configuration
public class InMemorySecurityConfig {
    // 手動(dòng)配置用戶信息
    @Bean
    public UserDetailsService users() {
        UserDetails user = User.withUsername("user")
                .password("{noop}user") // {noop}表示不加密
                .roles("USER")
                .build();
        UserDetails admin = User.withUsername("admin")
                .password("{noop}admin")
                .roles("ADMIN")
                .build();
		//可以繼續(xù)追加其它用戶...
        UserDetails anonymous = User.withUsername("anonymous")
                .password("{noop}anonymous")
                .roles("ANONYMOUS")
                .build();
        return new InMemoryUserDetailsManager(user, admin, anonymous);
    }
    // 配置安全策略 并配置/admin/** 只允許ADMIN角色用戶訪問(wèn)
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.
                authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/admin/**").hasRole("ADMIN")
                        .anyRequest().authenticated()
                )
                .formLogin(withDefaults())
                .logout(withDefaults())
        ;
        return http.build();
    }
}

配置說(shuō)明

  • 構(gòu)建UserDetailsService
    創(chuàng)建兩個(gè)用戶信息分別是:admin、user ,并由InMemoryUserDetailsManager進(jìn)行在內(nèi)存中保存用戶數(shù)據(jù)
  • SecurityFilterChain
    SecurityFilterChain中,默認(rèn)采用了Spring Security表單登陸登出方式,并配置/admin/**請(qǐng)求路徑下需要管理員角色方可訪問(wèn)

? 創(chuàng)建Controller測(cè)試

接下來(lái)我們創(chuàng)建用以測(cè)試的Controller :DemoMemoryController

@Controller
public class DemoMemoryController {
    //返回用戶信息及角色權(quán)限
    @GetMapping("/")
    public ResponseEntity<Map<String, Object>> index(Authentication authentication) {
        String username = authentication.getName();//用戶名
        Object principal =authentication.getPrincipal();//身份
        // 獲取用戶擁有的權(quán)限列表
        List<String> roles = authentication.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority)
                .collect(Collectors.toList());
        //返回用戶信息
        return ResponseEntity.ok(Map.of(
                "username", username,
                "principal", principal,
                "roles", roles));
    }
	//測(cè)試管理員權(quán)限
    @GetMapping("/admin/view")
    public ResponseEntity<String> admin() {
        return ResponseEntity.ok("管理員ADMIN角色訪問(wèn)ok");
    }
}

代碼說(shuō)明

  • 注入 Authentication 對(duì)象
    index 方法中,通過(guò)方法參數(shù)直接注入 Authentication 對(duì)象,Spring Security 會(huì)自動(dòng)傳入當(dāng)前認(rèn)證信息。
  • 提取用戶信息
    通過(guò) authentication.getName() 獲取當(dāng)前登錄用戶的用戶名;通過(guò) authentication.getAuthorities() 獲取用戶的權(quán)限列表,并將每個(gè)權(quán)限的 getAuthority() 值收集成一個(gè)字符串列表。

? 運(yùn)行測(cè)試

啟動(dòng)項(xiàng)目訪問(wèn),登陸頁(yè)中分別測(cè)試兩個(gè)用戶登陸查看信息,如user用戶:

接下來(lái)嘗試使用user用戶訪問(wèn) /admin/view 路徑,會(huì)出現(xiàn) 403 訪問(wèn)錯(cuò)誤提示:即您無(wú)權(quán)訪問(wèn)此地址

切換admin用戶登陸,繼續(xù)訪問(wèn) /admin/view 路徑,出現(xiàn) 管理員ADMIN角色訪問(wèn)ok 文字顯示即代表管理員角色允許訪問(wèn)

4. 追加密碼編碼器

在上述代碼中,我們使用了 password(“{noop}admin”) 聲明了密碼明文存儲(chǔ),如果我們需要對(duì)密碼加密,如何操作? 實(shí)際上 Spring Security 為我們提供了非常方便的密碼編碼器

密碼編碼器配置
只需要?jiǎng)?chuàng)建 PasswordEncoder Bean,并返回加密類型,如下代碼樣例:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService users(PasswordEncoder encoder) {
    UserDetails user = User.builder()
            .username("user")
            .password(encoder.encode("secret"))
            .roles("USER")
            .build();
    return new InMemoryUserDetailsManager(user);
}

支持的編碼格式:

# 不同前綴對(duì)應(yīng)不同編碼器
{noop} → NoOpPasswordEncoder (明文)
{bcrypt} → BCryptPasswordEncoder
{pbkdf2} → Pbkdf2PasswordEncoder
{scrypt} → SCryptPasswordEncoder
{sha256} → StandardPasswordEncoder

5. 總結(jié)

通過(guò)本章節(jié)的配置示例,相信你已經(jīng)可以使用 Spring Security 的基于內(nèi)存認(rèn)證方式來(lái)快速搭建安全認(rèn)證體系。

注意章節(jié)中提到的基于內(nèi)存的用戶認(rèn)證適用的場(chǎng)景,更多情況下還是建議使用 更為健全的認(rèn)證方式,如 基于數(shù)據(jù)庫(kù)的認(rèn)證、JWT 令牌認(rèn)證或 OAuth2,在下一章節(jié)我們將重點(diǎn)講述數(shù)據(jù)庫(kù)的認(rèn)證,敬請(qǐng)期待…

到此這篇關(guān)于最新Spring Security的基于內(nèi)存用戶認(rèn)證方式的文章就介紹到這了,更多相關(guān)Spring Security內(nèi)存用戶認(rèn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis-plus查詢條件拒絕自動(dòng)去重問(wèn)題

    Mybatis-plus查詢條件拒絕自動(dòng)去重問(wèn)題

    文章討論了在使用MyBatis進(jìn)行多表數(shù)據(jù)關(guān)聯(lián)查詢時(shí),由于主鍵ID重復(fù)導(dǎo)致數(shù)據(jù)被覆蓋的問(wèn)題,通過(guò)在實(shí)體類中添加偽列主鍵,并在查詢中使用該偽列字段,可以確保每條數(shù)據(jù)都有一個(gè)唯一的標(biāo)識(shí),從而避免數(shù)據(jù)被去重
    2025-12-12
  • Java設(shè)計(jì)模式之單例模式簡(jiǎn)介

    Java設(shè)計(jì)模式之單例模式簡(jiǎn)介

    這篇文章主要介紹了Java設(shè)計(jì)模式之單例模式簡(jiǎn)介,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot條件注解@Conditional詳細(xì)解析

    SpringBoot條件注解@Conditional詳細(xì)解析

    這篇文章主要介紹了SpringBoot條件注解@Conditional詳細(xì)解析,@Conditional是Spring4.0提供的一個(gè)用于條件裝配的注解,其定義了一個(gè)Condition的數(shù)組,只有當(dāng)數(shù)組所有的條件都滿足的時(shí)候,組件才會(huì)被導(dǎo)入容器,需要的朋友可以參考下
    2023-11-11
  • HttpServletRequest參數(shù)丟失問(wèn)題及解決

    HttpServletRequest參數(shù)丟失問(wèn)題及解決

    在使用HttpServletRequest進(jìn)行參數(shù)傳遞時(shí),如果在異步方法中使用,可能會(huì)導(dǎo)致參數(shù)丟失,這是因?yàn)镠ttpServletRequest對(duì)象在異步任務(wù)中可能被回收,為了解決這個(gè)問(wèn)題,可以在異步方法中提前提取參數(shù),然后將其傳遞給異步任務(wù)
    2025-10-10
  • SpringBoot攔截器(Interceptor)自定義實(shí)現(xiàn)登錄鑒權(quán)功能

    SpringBoot攔截器(Interceptor)自定義實(shí)現(xiàn)登錄鑒權(quán)功能

    在 Web 項(xiàng)目中,登錄鑒權(quán)是最核心的安全機(jī)制,SpringBoot 提供的?HandlerInterceptor 攔截器,是實(shí)現(xiàn)登錄校驗(yàn)、日志記錄、接口限流最優(yōu)雅的方案,本篇文章將介紹原理、自定義攔截器、登錄校驗(yàn)實(shí)戰(zhàn)、放行白名單、全局異常處理,需要的朋友可以參考下
    2026-03-03
  • java數(shù)據(jù)結(jié)構(gòu)和算法中數(shù)組的簡(jiǎn)單入門(mén)

    java數(shù)據(jù)結(jié)構(gòu)和算法中數(shù)組的簡(jiǎn)單入門(mén)

    在本文里小編給大家整理了關(guān)于java數(shù)據(jù)結(jié)構(gòu)和算法中數(shù)組的簡(jiǎn)單入門(mén)知識(shí)點(diǎn)整理,需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法

    SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法

    這篇文章主要介紹了SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • maven打包時(shí)配置多環(huán)境參數(shù)的實(shí)現(xiàn)

    maven打包時(shí)配置多環(huán)境參數(shù)的實(shí)現(xiàn)

    本文主要介紹了maven打包時(shí)配置多環(huán)境參數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 詳解idea maven項(xiàng)目如何使用lib下得jar包

    詳解idea maven項(xiàng)目如何使用lib下得jar包

    這篇文章主要介紹了詳解idea maven項(xiàng)目如何使用lib下得jar包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • java使用Jsoup連接網(wǎng)站超時(shí)的解決方法

    java使用Jsoup連接網(wǎng)站超時(shí)的解決方法

    jsoup是一個(gè)非常好的解析網(wǎng)頁(yè)的包,用java開(kāi)發(fā)的,提供了類似DOM,CSS選擇器的方式來(lái)查找和提取文檔中的內(nèi)容,提取文檔內(nèi)容時(shí)會(huì)出現(xiàn)超時(shí)的情況,解決方法可看下文
    2013-11-11

最新評(píng)論

栾城县| 浦县| 秦皇岛市| 延安市| 武冈市| 陵川县| 越西县| 广汉市| 阿坝| 厦门市| 成武县| 百色市| 海原县| 贵州省| 海城市| 八宿县| 张家界市| 长寿区| 义马市| 德化县| 富源县| 东海县| 上虞市| 通道| 卫辉市| 千阳县| 泰兴市| 新龙县| 新郑市| 通化市| 榕江县| 思南县| 南江县| 讷河市| 涟源市| 虹口区| 平远县| 庐江县| 伊春市| 仁化县| 太湖县|