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

Spring Security靈活的PasswordEncoder加密方式解析

 更新時間:2023年09月18日 14:12:47   作者:恒宇少年  
這篇文章主要介紹了Spring Security靈活的PasswordEncoder加密方式解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

導讀

本章基于Spring Security 5.4.1版本編寫,從5.x版本開始引入了很多新的特性。

為了適配老系統(tǒng)的安全框架升級,Spring Security也是費勁了心思,支持不同的密碼加密方式,而且根據(jù)不同的用戶可以使用不同的加密方式。

構建Spring Security項目

Spring Security的集成使用還是很簡單的,根據(jù)項目使用的框架不同大致分為兩種集成方式:

SpringBoot方式集成

SecurityBom方式集成

SpringBoot方式構建

pom.xml文件內添加如下內容:

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

SecurityBom方式構建

spring-security-bom是一個提供了Spring Security指定版本的全部默認依賴的pom類型項目,我們可以通過dependencyManagement進行配置到項目中,這樣我們就可以直接添加對應的dependency了(注意:版本號因為bom已經(jīng)注定,所以dependency不需要指定.)。

pom.xml文件內添加如下內容:

<dependencies>
  // ...省略其他依賴
  <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-core</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <!--配置SecurityBom-->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-bom</artifactId>
        <version>5.4.1</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

注意事項:我們構建Web類型的安全項目時,spring-security-config、spring-security-core、spring-security-web三個依賴都是必須添加的。

PasswordEncoder

PasswordEncoderSpring Security提供的密碼加密方式的接口定義,源碼類如下所示:

public interface PasswordEncoder {
    /**
     * Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or
     * greater hash combined with an 8-byte or greater randomly generated salt.
     */
    String encode(CharSequence rawPassword);
    /**
     * Verify the encoded password obtained from storage matches the submitted raw
     * password after it too is encoded. Returns true if the passwords match, false if
     * they do not. The stored password itself is never decoded.
     *
     * @param rawPassword the raw password to encode and match
     * @param encodedPassword the encoded password from storage to compare with
     * @return true if the raw password, after encoding, matches the encoded password from
     * storage
     */
    boolean matches(CharSequence rawPassword, String encodedPassword);
    /**
     * Returns true if the encoded password should be encoded again for better security,
     * else false. The default implementation always returns false.
     * @param encodedPassword the encoded password to check
     * @return true if the encoded password should be encoded again for better security,
     * else false.
     */
    default boolean upgradeEncoding(String encodedPassword) {
        return false;
    }
}
  • #encode

    該方法提供了明文密碼的加密處理,加密后密文的格式主要取決于PasswordEncoder接口實現(xiàn)類實例。

  • #matches

    匹配存儲的密碼以及登錄時傳遞的密碼登錄密碼是經(jīng)過加密處理后的字符串)是否匹配,如果匹配該方法則會返回true.

內置的PasswordEncoder實現(xiàn)列表

NoOpPasswordEncoder(已廢除)

明文密碼加密方式,該方式已被廢除(不建議在生產(chǎn)環(huán)境使用),不過還是支持開發(fā)階段測試Spring Security的時候使用。

BCryptPasswordEncoder

Argon2PasswordEncoder

Pbkdf2PasswordEncoder

SCryptPasswordEncoder

DelegatingPasswordEncoder

在之前版本集成Spring Secuirty時,我們需要通過@Bean的方式來配置全局統(tǒng)一使用的密碼加密方式(PasswordEncoder),當然這種方式現(xiàn)在還是適用的,不過在5.x版本開始為了支持動態(tài)的多種密碼加密方式,DelegatingPasswordEncoder委托加密方式類應用而生,它內部其實是一個Map集合,根據(jù)傳遞的Key(Key為加密方式)獲取Map集合的Value,而Value則是具體的PasswordEncoder實現(xiàn)類。

DelegatingPasswordEncoder建立密碼格式的規(guī)則,格式如:{bcrypt}encodePassword,示例如下所示:

// {bcrypt}格式會委托給BCryptPasswordEncoder加密類
{bcrypt}$2a$10$iMz8sMVMiOgRgXRuREF/f.ChT/rpu2ZtitfkT5CkDbZpZlFhLxO3y
// {pbkdf2}格式會委托給Pbkdf2PasswordEncoder加密類
{pbkdf2}cc409867e39f011f6332bbb6634f58e98d07be7fceefb4cc27e62501594d6ed0b271a25fd9f7fc2e
// {MD5}格式會委托給MessageDigestPasswordEncoder加密類
{MD5}e10adc3949ba59abbe56e057f20f883e
// {noop}明文方式,委托給NoOpPasswordEncoder
{noop}123456
// ...

指定用戶使用PasswordEncoder

DelegatingPasswordEncoder是默認的PasswordEncoder加密方式,所以我們可以為不同的用戶配置所使用不同的密碼加密方式,只需要密碼格式按照:{away}encodePassword來進行持久化即可。

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .formLogin()
                .and()
                .csrf()
                .disable()
                .authorizeRequests()
                .antMatchers("/**")
                .authenticated();
    }
    @Bean
    public UserDetailsService users() {
        // {MD5}value必須大寫,value值必須是32位小寫
        // admin
        UserDetails admin = User.builder()
                //.passwordEncoder(encoder::encode)
                .username("admin").password(
                        "{MD5}e10adc3949ba59abbe56e057f20f883e"
                ).roles("admin").build();
        // hengboy
        UserDetails hengboy = User.builder()
                .username("hengboy")
                .password("{bcrypt}$2a$10$iMz8sMVMiOgRgXRuREF/f.ChT/rpu2ZtitfkT5CkDbZpZlFhLxO3y")
                .roles("admin")
                .build();
        // yuqiyu
        UserDetails yuqiyu = User.builder().username("yuqiyu")
                //.password("{noop}123456")
                .password("{pbkdf2}cc409867e39f011f6332bbb6634f58e98d07be7fceefb4cc27e62501594d6ed0b271a25fd9f7fc2e")
                .roles("user").build();
        return new InMemoryUserDetailsManager(admin, yuqiyu, hengboy);
    }
}

上面是使用內存方式存儲安全用戶的實現(xiàn)代碼,在創(chuàng)建UserDetailsService類的實例時將用戶列表通過構造參數(shù)進行傳遞。

所創(chuàng)建的用戶:admin,采用MD5的加密方式進行密碼編碼,這里需要注意的是MD5加密后的字符串必須為小寫32位。

所創(chuàng)建的用戶:hengboy,采用bcrypt方式進行密碼編碼。

所創(chuàng)建的用戶:yuqiyu,采用pbkdf2方式進行密碼編碼。

覆蓋默認的PasswordEncoder

Spring Security 5.x版本默認的PasswordEncoder方式改成了DelegatingPasswordEncoder委托類,不過如果是通過PasswordEncoderFactories#createDelegatingPasswordEncoder方法創(chuàng)建的DelegatingPasswordEncoder實例時,默認其實使用的還是BCryptPasswordEncoder,源碼如下所示:

public static PasswordEncoder createDelegatingPasswordEncoder() {
  String encodingId = "bcrypt";
  Map<String, PasswordEncoder> encoders = new HashMap<>();
  encoders.put(encodingId, new BCryptPasswordEncoder());
  // 省略...
  return new DelegatingPasswordEncoder(encodingId, encoders);
}

如果我們項目中不需要使用DelegatingPasswordEncoder委托密碼編碼方式,可以通過@Bean的方式來統(tǒng)一配置全局共用的PasswordEncoder,如下所示:

@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder();
}

可以根據(jù)項目自行選擇所使用的PasswordEncoder實現(xiàn)類。

以上就是Spring Security靈活的PasswordEncoder加密方式解析的詳細內容,更多關于Spring Security PasswordEncoder加密的資料請關注腳本之家其它相關文章!

相關文章

  • SpringMVC 攔截器的使用示例

    SpringMVC 攔截器的使用示例

    這篇文章主要介紹了SpringMVC 攔截器的使用示例,幫助大家更好的理解和學習使用SpringMVC,感興趣的朋友可以了解下
    2021-04-04
  • Java在枚舉類型中增加自定義方法詳解

    Java在枚舉類型中增加自定義方法詳解

    這篇文章主要介紹了Java在枚舉類型中增加自定義方法詳解,對于枚舉類型來說,除了無法繼承它以外,基本可以將它看作一個普通的類,這意味著你可以在里面增加自定義的方法,甚至可以增加一個 main() 方法,需要的朋友可以參考下
    2023-11-11
  • Java中通過繼承Thread類創(chuàng)建線程的步驟

    Java中通過繼承Thread類創(chuàng)建線程的步驟

    本文介紹了如何通過繼承Thread類創(chuàng)建線程,包括Thread類的定義、創(chuàng)建線程的步驟、優(yōu)缺點、使用場景和注意事項,通過示例代碼展示了多線程下載文件的實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • swagger文檔增強工具knife4j使用圖文詳解

    swagger文檔增強工具knife4j使用圖文詳解

    這篇文章主要介紹了swagger文檔增強工具knife4j使用詳解,想要使用knife4j非常簡單,只要在Springboot項目中引入knife4j的依賴即可,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Ireport的安裝與使用教程

    Ireport的安裝與使用教程

    這篇文章主要介紹了Ireport的安裝與使用教程,需要的朋友可以參考下
    2021-10-10
  • Springboot集成knife4j實現(xiàn)風格化API文檔

    Springboot集成knife4j實現(xiàn)風格化API文檔

    這篇文章主要介紹了Springboot如何集成knife4j實現(xiàn)風格化API文檔,幫助大家更好的使用springboot框架,感興趣的朋友可以了解下
    2020-12-12
  • Java?精煉解讀時間復雜度與空間復雜度

    Java?精煉解讀時間復雜度與空間復雜度

    對于一個算法,其時間復雜度和空間復雜度往往是相互影響的,當追求一個較好的時間復雜度時,可能會使空間復雜度的性能變差,即可能導致占用較多的存儲空間,這篇文章主要給大家介紹了關于Java時間復雜度、空間復雜度的相關資料,需要的朋友可以參考下
    2022-03-03
  • Java數(shù)據(jù)溢出代碼詳解

    Java數(shù)據(jù)溢出代碼詳解

    這篇文章主要介紹了Java數(shù)據(jù)溢出的相關內容,包括具體代碼示例,分析比較詳細,希望對大家有所幫助,感興趣的朋友可以參考下。
    2017-09-09
  • SpringBoot如何實現(xiàn)一個實時更新的進度條的示例代碼

    SpringBoot如何實現(xiàn)一個實時更新的進度條的示例代碼

    本文詳細的介紹了SpringBoot如何實現(xiàn)一個實時更新的進度條,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • eclipse創(chuàng)建項目沒有dynamic web的解決方法

    eclipse創(chuàng)建項目沒有dynamic web的解決方法

    最近上課要用到eclipse,要用到Dynamic web project.但是我下載的版本上沒有.接下來就帶大家了解 eclipse創(chuàng)建項目沒有dynamic web的解決方法,文中有非常詳細的圖文示例,需要的朋友可以參考下
    2021-06-06

最新評論

客服| 安龙县| 涡阳县| 安塞县| 广昌县| 轮台县| 孟津县| 万山特区| 安庆市| 民勤县| 铜川市| 宜春市| 麻江县| 崇阳县| 潜山县| 绿春县| 新龙县| 沙坪坝区| 古丈县| 延津县| 连州市| 扎赉特旗| 嘉峪关市| 民和| 廉江市| 小金县| 噶尔县| 赣州市| 崇信县| 曲松县| 平邑县| 堆龙德庆县| 宜丰县| 乌审旗| 桦南县| 郴州市| 栾川县| 五华县| 大姚县| 左贡县| 安达市|