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

SpringBoot3整合SpringSecurity6添加用戶、密碼加密的方式

 更新時間:2025年05月21日 08:46:56   作者:程序員曉凡  
這篇文章主要介紹了SpringBoot3整合SpringSecurity6添加用戶、密碼加密,需要的朋友可以參考下

寫在前面

還記得在之前的文章中,我們在user表中手動插入了3條數(shù)據(jù)嗎?

當時,大家就會有疑問。這一串密碼是怎么來的呢,我們?yōu)樯兑獙γ艽a進行加密?

帶著這些疑問,我們繼續(xù)上路。我們在開發(fā)一個應(yīng)用系統(tǒng),肯定是少不了用戶注冊功能的。說到注冊,無非就是往user用戶信息表中插入一條數(shù)據(jù)。

這條數(shù)據(jù)包含用戶名 [xiezhr]、密碼 [123456]等字段,而往往 密碼這個字段不可能將123456直接存儲的,而是通過各種加密手段處理。最終如上圖所示,

即使數(shù)據(jù)庫因各種原因泄露,法外狂徒張三也不知道用戶的密碼,這讓系統(tǒng)又加了一把鎖。

一、密碼明文存儲的危害

不知道大家前段時間有沒有聽到這么一個新聞。愛爾蘭數(shù)據(jù)保護委員會(DPC)對Meta(前Facebook) 處以9100萬歐元(7.14億元人民幣)的罰款,

原因正是因為Meta在未加保護或加密的情況下以明文形式存儲用戶密碼。

從Meta事件再次證明了,即使在大的企業(yè),也難免會有所疏漏,雖然事件中并沒有提到泄露信息,但一旦泄露,后果真的不可想象。

密碼明文存儲就像是你把家里的鑰匙掛在門上,任何人都可以拿走鑰匙,進入你的家;你的日記本沒有上鎖,任何人都可以打開看;

安全無小事,安全無小事,安全無小事。

二、加密方式及實現(xiàn)

2.1 對稱加密

① 簡介

就像你和你的好朋友之間有一個只有你們倆知道的秘密暗號。你們用這個暗號來傳遞信息,別人就算看到了也看不懂。

② 常見算法

  • AES(高級加密標準)
  • DES(數(shù)據(jù)加密標準)

②實現(xiàn)

首先,你和你的朋友要商量好一個“暗號”(密鑰)。然后,你把想說的話(明文)轉(zhuǎn)換成只有你們倆能懂的暗號(密文)。你的朋友收到后,再用同樣的“暗號”把密文變回原話。

2.2 非對稱加密

① 簡介

你有一個帶鎖的信箱,你把鑰匙分成兩把,一把公鑰(可以給別人),一把私鑰(自己保管)。別人用公鑰把信鎖上,只有你能用私鑰打開

② 常見算法

RSA算法

③ 實現(xiàn)

你生成一對鑰匙,公鑰和私鑰。別人用你的公鑰加密信息,然后發(fā)給你。你收到后,用自己的私鑰解密。

2.3 哈希加密

① 簡介

像是把信息扔進一個特殊的攪拌機,出來的是一個固定大小的“信息指紋”。這個“指紋”不能還原成原來的信息。

② 常見算法

  • MD5
  • SHA-1
  • SHA-256
  • SHA-512

③ 實現(xiàn)

把信息(明文)通過一個哈希函數(shù)處理,生成一個哈希值。這個哈希值用來驗證信息是否被篡改。

  • 選擇一個哈希算法(如SHA-256)。
  • 把明文通過哈希算法處理,生成哈希值。
  • 存儲或傳輸哈希值。
  • 接收者收到信息后,再次計算哈希值,與收到的哈希值對比,驗證信息完整性。

回到Spring Sesurity中,框架提供了PasswordEncoder 接口來實現(xiàn)密碼加密。通過不同的實現(xiàn),來配置不同Hash算法(MD5、SHA-256SHA-512等)

但是僅僅通過上面簡單的加密依然不能防止惡意用戶的攻擊,為什么呢?

惡意用戶會預(yù)先計算很多密碼的加密結(jié)果,保存到“表”里。這里的“表”指的就我們常說的彩虹表。

當想要破解某個密碼時,就會用這個密碼去“表”里查找對應(yīng)的加密結(jié)果,如果找到了,就知道這個密碼是什么了。

那么SpringSecurity怎么才能防止彩虹表攻擊呢?

常用的就是使用鹽(Salt)

顧名思義,鹽就是給密碼加點“料”,每次加密時都加點不同的“料”,這樣即使兩個用戶的密碼相同,加密后的結(jié)果也會因為鹽的不同而不同。

Spring Security可以通過配置密碼編碼器(如BCryptPasswordEncoder)來自動為每個密碼生成一個唯一的鹽來保證安全。

三、密碼加密測試

上面說了一堆理論知識,接下來我們來測試下通過BCryptPasswordEncoder 來加密

@Test
public void testPasswordEncoder(){
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    //明文都是xiezhr,但是每次生成的密文是不一致的
    String ret1 = encoder.encode("xiezhr");
    String ret2 = encoder.encode("xiezhr");
    System.out.println("第一次生成密碼:"+ret1);
    System.out.println("第二次生成密碼:"+ret2);
    Assert.isTrue(encoder.matches("xiezhr", ret1), "密碼不一致");
    Assert.isTrue(encoder.matches("xiezhr", ret2), "密碼不一致");
}
//輸出
第一次生成密碼:$2a$10$96WLiLGkHOcxYNw9wWHDeuXYVznW30S7F5u4Stib71gFp3Mq/mENa
第二次生成密碼:$2a$10$f1JowhAXqYI1UBF4jRY5AeziL/83NRzWfvUtxoXzgW0xUQ/uLLUWK
//這里并沒有拋出密碼不一致的異常

從上面測試中,我們可以看出,相同明文"xiezhr" 通過BCrypt算法加密后,每次生成的密文都是不同的。

再通過matches 來驗證兩次生成的密文,都與“xiezhr” 匹配

四、添加新用戶

在前面的學習中,我們知道了怎么進行密碼加密,接下來,該輪到實操了。

我們要實現(xiàn)將一個用戶添加到數(shù)據(jù)庫中,并且密碼進行加密。

4.1 替換默認密碼加密方式

Spring Security中默認使用的PasswordEncoder要求數(shù)據(jù)庫中的密碼格式為:{id}password 。它會根據(jù)id去判斷密碼的加密方式 ,所以我們之前數(shù)據(jù)庫中存儲的密碼為{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW

但是我們一般不會采用這種方式。所以就需要替換PasswordEncoder默認實現(xiàn)方式。我們一般使用SpringSecurity為我們提供的BCryptPasswordEncoder

怎么替換呢?其實非常簡單

我們只需要使用把BCryptPasswordEncoder對象注入Spring容器中,SpringSecurity就會使用該PasswordEncoder來進行密碼校驗。

@Configuration  //標明這個類為配置類,spring應(yīng)用程序一啟動,類中的been 就會被初始化在spring容器中
@EnableWebSecurity  //開啟spring security 自定義配置
public class WebSecurityConfig {
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

4.2 Controller

添加addUser 方法,用于接收前臺傳過來的用戶信息。這里省略了上一節(jié)的代碼

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/addUser")
    public int addUser(@RequestBody User user){
       return userService.addUser(user);
    }
}

4.3 Service

由于要對前臺傳過來的密碼進行加密處理,我們這里需要單獨添加addUser 單獨處理密碼,具體方法如下

1、UserService

public interface UserService extends IService<User> {
    int addUser(User user);
}

2、UserServiceImpl

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    PasswordEncoder passwordEncoder;
    @Autowired
    UserMapper userMapper;
    @Override
    public int addUser(User user) {
        String encode = passwordEncoder.encode(user.getPassword());
        user.setPassword(encode);
        user.setEnabled(true);
        return  userMapper.insert(user);
    }
}

4.4 測試一下

到了這里,小伙伴是不是覺得已經(jīng)大功告成了,我們來用postman工具測試一下

哦豁,報401 Unauthorized了,這是為啥呢?

我們要對/user/addUser 進行放行

@Configuration  //標明這個類為配置類,spring應(yīng)用程序一啟動,類中的been 就會被初始化在spring容器中
@EnableWebSecurity  //開啟spring security 自定義配置
public class WebSecurityConfig {
     @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf-> csrf.disable());
        http.authorizeHttpRequests(auth -> auth
                        .requestMatchers("/user/addUser").permitAll()
                        .anyRequest().authenticated()
                );
        return http.build();
    }
}

添加上面代碼之后,再用postman測試,用戶就正常添加進去了

我們再來看看數(shù)據(jù)庫,Jon這個用戶已經(jīng)加進去了,而且密碼123456 也是加過密的

五、小結(jié)

到此,我們已經(jīng)將一個新用戶添加到數(shù)據(jù)庫中了,并且用戶密碼也做了加密處理。

以上操作,我們只是為了演示添加用戶的基本操作,實際項目中會比這個復(fù)雜一些,不過原理都是一樣的。

在實際的前后端分離項目中,我們還會涉及到跨域處理、統(tǒng)一返回結(jié)果、再插入用戶之前判斷用戶是否存在等等。

到此這篇關(guān)于SpringBoot3整合SpringSecurity6添加用戶、密碼加密的文章就介紹到這了,更多相關(guān)SpringBoot3整合SpringSecurity6添加用戶、密碼加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)微信公眾號掃一掃

    java實現(xiàn)微信公眾號掃一掃

    這篇文章主要為大家詳細介紹了java實現(xiàn)微信公眾號掃一掃,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 詳解Spring Security中的HttpBasic登錄驗證模式

    詳解Spring Security中的HttpBasic登錄驗證模式

    HttpBasic登錄驗證模式是Spring Security實現(xiàn)登錄驗證最簡單的一種方式,也可以說是最簡陋的一種方式,這篇文章主要介紹了Spring Security的HttpBasic登錄驗證模式,需要的朋友可以參考下
    2019-11-11
  • IDEA中如何引入spring的命名空間

    IDEA中如何引入spring的命名空間

    這篇文章主要介紹了IDEA中如何引入spring的命名空間問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • springBoot如何動態(tài)加載資源文件

    springBoot如何動態(tài)加載資源文件

    這篇文章主要介紹了springBoot如何動態(tài)加載資源文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java中stream的peek()用法詳解

    java中stream的peek()用法詳解

    這篇文章主要介紹了java中stream的peek()用法詳解,peek的作用是
    改變元素的內(nèi)部狀態(tài),對每個object執(zhí)行 saveInfomation(object, params),然后把結(jié)果收集到一個 List 里,這里涉及到了最終操作,需要的朋友可以參考下
    2024-01-01
  • SpringBoot安全策略開發(fā)之集成數(shù)據(jù)傳輸加密

    SpringBoot安全策略開發(fā)之集成數(shù)據(jù)傳輸加密

    這篇文章主要介紹了SpringBoot集成數(shù)據(jù)傳輸加密,近期在對開發(fā)框架安全策略方面進行升級優(yōu)化,提供一些通用場景的解決方案,本文針對前后端數(shù)據(jù)傳輸加密進行簡單的分享
    2023-01-01
  • MyBatis-Plus如何關(guān)閉SQL日志打印詳解

    MyBatis-Plus如何關(guān)閉SQL日志打印詳解

    在使用mybatisplus進行開發(fā)時,日志是一個非常有用的工具,它可以幫助我們更好地了解和調(diào)試我們的代碼,這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何關(guān)閉SQL日志打印的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • LongAdder原理及創(chuàng)建使用示例詳解

    LongAdder原理及創(chuàng)建使用示例詳解

    這篇文章主要為大家介紹了LongAdder原理及創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Java字符編碼簡介_動力節(jié)點Java學院整理

    Java字符編碼簡介_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java字符編碼簡介,本文主要包括以下幾個方面:編碼基本知識,Java,系統(tǒng)軟件,url,工具軟件等,感興趣的朋友一起看看吧
    2017-08-08
  • IKAnalyzer使用不同版本中文分詞的切詞方式實現(xiàn)相同功能效果

    IKAnalyzer使用不同版本中文分詞的切詞方式實現(xiàn)相同功能效果

    今天小編就為大家分享一篇關(guān)于IKAnalyzer使用不同版本中文分詞的切詞方式實現(xiàn)相同功能效果,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論

同仁县| 区。| 石泉县| 天津市| 温泉县| 田东县| 温泉县| 浏阳市| 安徽省| 平潭县| 东丰县| 扎赉特旗| 绵阳市| 祁东县| 宜都市| 桃源县| 玛多县| 汾阳市| 达拉特旗| 昭通市| 宜阳县| 化隆| 津市市| 利川市| 都匀市| 海原县| 白朗县| 海南省| 彝良县| 莱阳市| 竹北市| 会宁县| 怀安县| 和静县| 衡阳县| 墨江| 霸州市| 平乡县| 隆子县| 富顺县| 云龙县|