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

Spring?Security配置保姆級教程

 更新時間:2023年02月15日 14:05:00   作者:自牧君  
Spring?Security是一個功能強大且可高度自定義的身份驗證和訪問控制框架。它是保護基于Spring的應(yīng)用程序的事實上的標準。Spring?Security是一個專注于為Java應(yīng)用程序提供身份驗證和授權(quán)的框架

背景

筆者使用 Spring Security 5.8 時,發(fā)現(xiàn)網(wǎng)上很多教程所教的 Spring Security 配置類 SecurityConfig.java 的配置風格還是停留在繼承 WebSecurityConfigurerAdapter 的風格。然而, WebSecurityConfigurerAdapter 在 Spring Security 5.7.0-M2 版本中已經(jīng)被 deprecated 了。因此在本文中分享 Spring 官方最新推薦的 Spring Security 配置風格。

一、前言

在 Spring Security 5.7.0 (2022 年 2 月 21 日更新) 中,官方棄用了 WebSecurityConfigurerAdapter 。因為Spring 官方鼓勵開發(fā)者朝著組件化安全配置遷移。為了幫助開發(fā)者順利過渡到這種配置風格,Spring 官方準備了一系列常見的使用案例和建議的替代方案。

在下面的例子中,我們將遵循最佳實踐,使用 Spring Security lambda DSL 和 HttpSecurity.java 中的 authorizeHttpRequests() 方法來定義授權(quán)規(guī)則。如果您對 lambda DSL 感到陌生,可以參考我的這篇文章進行學習:《如何使用Lambda DSL配置Spring Security》。

二、配置HttpSecurity

在 Spring Security 5.4 中,新增了通過創(chuàng)建一個 SecurityFilterChain 的 Bean 來配置 HttpSecurity 的功能。

首先來看看沒有棄用 WebSecurityConfigurerAdapter 的示例,下面是使用 WebSecurityConfigurerAdapter 的配置示例,該配置使用 httpBasic() 方法來保護所有的接口。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
    }
}

但今后, WebSecurityConfigurerAdapter 就被 Spring 官方棄用了,取而代之的是通過注冊一個 SecurityFilterChain 的 Bean 來配置 HttpSecurity 。

@Configuration
public class SecurityConfiguration {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
                .anyRequest().authenticated()
            )
            .httpBasic(withDefaults());
        return http.build();
    }
}

三、配置WebSecurity

在 Spring Security 5.4 中,Spring 官方新增了 WebSecurityCustomizer

WebSecurityCustomizer 是一個回調(diào)接口,可以用來配置 WebSecurity 。

首先來看看先前的舊配置風格的代碼示例:使用 WebSecurityConfigurerAdapter 來忽略與 /ignore1/ignore2 匹配的請求 (即不攔截這兩個請求進行認證授權(quán)) 。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/ignore1", "/ignore2");
    }
}

但今后,Spring 官方不再推薦上面的配置風格,取而代之的是向 Spring 容器中注入一個 WebSecurityCustomizer 的 Bean 。

@Configuration
public class SecurityConfiguration {
    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
    	return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
    }
}

注意:如果你想通過配置 WebSecurity 來忽略請求,建議優(yōu)先考慮通過配置 HttpSecurityauthorizeHttpRequests() 方法,使用 .permitAll() 來實現(xiàn)。

四、配置LDAP認證

LDAP (Light Directory Access Protocol) ,是基于 X.500 標準的輕量級目錄訪問協(xié)議。有興趣的同學可以自行谷歌搜索學習,LDAP 這種協(xié)議常用于授權(quán)認證的情景。

在 Spring Security 5.7 中,Spring 官方新增了 EmbeddedLdapServerContextSourceFactoryBean 、LdapBindAuthenticationManagerFactoryLdapPasswordComparisonAuthenticationManagerFactory ,用來創(chuàng)建一個嵌入式 LDAP 服務(wù)器和一個 AuthenticationManager 對象,來執(zhí)行 LDAP 認證。

同樣的,先來看先前舊的配置風格的示例,繼承 WebSecurityConfigurerAdapter ,創(chuàng)建一個嵌入式 LDAP 服務(wù)器,創(chuàng)建一個 AuthenticationManager ,使用綁定認證 (Bind Authentication) 來執(zhí)行 LDAP 認證。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .ladpAuthentication()
            .userDetailsContextMapper(new PersonContextMapper())
            .userDnPatterns("uid={0}, ou=people")
            .contextSource()
            .port(0);
    }
}

但今后,Spring 官方不再推薦上面的配置風格,取而代之的是使用新的 LDAP 類。

@Configuration
public class SecurityConfiguration {
    @Bean
    public EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean() {
        EmbeddedLdapServerContextSourceFactoryBean contextSourceFactoryBean =
            EmbeddedLdapServerContextSourceFactoryBean.fromEmbeddedLdapServer();
        contextSourceFactoryBean.setPort(0);
        return contextSourceFactoryBean;
    }
    @Bean
    AuthenticationManager ldapAuthenticationManager(
        	BaseLdapPathContextSource contextSource) {
        LdapBindAuthenticationManagerFactory factory = 
            new LdapBindAuthenticationManagerFactory(contextSource);
        factory.setUserDnPatterns("uid={0}, ou=people");
        factory.setUserDetailsContextMapper(new PersonContextMapper());
        return factory.createAuthenticationManager();
    }
}

五、配置JDBC認證

同樣的,先來看先前舊的配置風格的示例,繼承 WebSecurityConfigurerAdapter ,使用一個以默認方式初始化且具有一個用戶的嵌入式 DataSource 。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .build();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        auth.jdbcAuthentication()
            .withDefaultSchema()
            .dataSource(dataSource())
            .withUser(user);
    }
}

但今后,Spring 官方不再推薦上面的配置風格,取而代之的是向 Spring 容器注入一個 JdbcUserDetailsManager 的 Bean 。

@Configuration
public class SecurityConfiguration {
    @Bean
    public DataSource datasource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
            .build();
    }
    @Bean
    public UserDetailsManager users(DataSource dataSource) {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
        users.createUser(user);
        return users;
    }
}

注意:上面的代碼示例第 14 行中,為了密碼的可讀性才使用方法 User.withDefaultPasswordEncoder() 。在實際的生產(chǎn)環(huán)境中并不會使用默認的密碼編碼器,因為這樣存儲的密碼是明文,十分不安全。這里推薦使用 BCryptPasswordEncoder 作為密碼編碼器來對密碼進行加密成暗文存儲。

六、In-Memory Authentication

與上面存儲在數(shù)據(jù)庫的不同,In-Memory 是把用戶信息存儲在內(nèi)存中。

同樣的,先來看先前舊的配置風格的示例,繼承 WebSecurityConfigurerAdapter 來配置存儲在內(nèi)存中的一個用戶信息。

@Configuration
public class SecurityConfiguration extends WebSecutiryConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        auth.inMemoryAuthentication()
            .withUser(user);
    }
}

但今后,Spring 官方不再推薦上面的配置風格,取而代之的是向 Spring 容器注入一個 InMemoryUserDetailsManager 的 Bean 。

@Configuration
public class SecurityConfiguration {
    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

注意:上面的代碼示例第 6 行中,為了密碼的可讀性才使用方法 User.withDefaultPasswordEncoder() 。在實際的生產(chǎn)環(huán)境中并不會使用默認的密碼編碼器,因為這樣存儲的密碼是明文,十分不安全。這里推薦使用 BCryptPasswordEncoder 作為密碼編碼器來對密碼進行加密成暗文存儲。

七、配置全局AuthenticationManager

如果你想要創(chuàng)建整個應(yīng)用都可以調(diào)用的 AuthenticationManager 對象,只需要簡單地使用注解 @Bean 來注入 Spring 容器。

配置風格示例與 LDAP 的配置示例相同。

八、配置局部AuthenticationManager

在 Spring Security 5.6 中,Spring 官方在 HttpSecurity 中新增了方法 authenticationManager() ,該方法重寫具體的 SecurityFilterChain 的默認 AuthenticationManager 。

下面是配置自定義局部 AuthenticationManager 的代碼示例。

@Configuration
public class SecurityConfiguration {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authz) -> authz
               	.anyRequest().authticated())
            .httpBasic(withDefaults())
            .authenticationManager(new CustomAuthenticationManager());
        return http.build();
    }
}

九、調(diào)用局部AuthenticationManager

可以使用 custom DSL 來調(diào)用局部 AuthenticationManager 。這實際上正是 Spring Security 內(nèi)部實現(xiàn)諸如 HttpSecurity.authorizeRequests() 方法的方式。

public class MyCustomDsl extends AbstractHttpConfigurer<MyCustomDsl, HttpSecurity> {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class);
        http.addFilter(new CustomFilter(authenticationManager));
    }
    public static MyCustomDsl customDsl() {
        return new MyCustomDsl();
    }
}

當Spring Security開始構(gòu)建 SecurityFilterChain 時,custom DSL 就會被自動調(diào)用。

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    // ...
    http.apply(customDsl());
    return http.build();
}

到此這篇關(guān)于Spring Security配置保姆級教程的文章就介紹到這了,更多相關(guān)Spring Security配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Spring AMQP實現(xiàn)消息隊列的示例代碼

    基于Spring AMQP實現(xiàn)消息隊列的示例代碼

    Spring AMQP作為Spring框架的一部分,是一套用于支持高級消息隊列協(xié)議(AMQP)的工具,AMQP是一種強大的消息協(xié)議,旨在支持可靠的消息傳遞,本文給大家介紹了如何基于Spring AMQP實現(xiàn)消息隊列,需要的朋友可以參考下
    2024-03-03
  • 老生常談java垃圾回收算法(必看篇)

    老生常談java垃圾回收算法(必看篇)

    下面小編就為大家?guī)硪黄仙U刯ava垃圾回收算法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java8深入學習系列(一)lambda表達式介紹

    Java8深入學習系列(一)lambda表達式介紹

    Java8最值得學習的特性就是Lambda表達式和Stream API,所以我們學習java8的第一課就是學習lambda表達式,下面這篇文章主要給大家介紹了關(guān)于Java8學習之lambda的相關(guān)資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Spring成員對象注入的三種方式詳解

    Spring成員對象注入的三種方式詳解

    這篇文章主要為大家詳細介紹了Spring成員對象注入的三種方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java SpringBoot自動裝配原理詳解及源碼注釋

    Java SpringBoot自動裝配原理詳解及源碼注釋

    SpringBoot的自動裝配是拆箱即用的基礎(chǔ),也是微服務(wù)化的前提。其實它并不那么神秘,我在這之前已經(jīng)寫過最基本的實現(xiàn)了,大家可以參考這篇文章,來看看它是怎么樣實現(xiàn)的,我們透過源代碼來把握自動裝配的來龍去脈
    2021-10-10
  • Java數(shù)組,去掉重復(fù)值、增加、刪除數(shù)組元素的實現(xiàn)方法

    Java數(shù)組,去掉重復(fù)值、增加、刪除數(shù)組元素的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狫ava數(shù)組,去掉重復(fù)值、增加、刪除數(shù)組元素的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 淺談SpringMVC對RESTfull的支持

    淺談SpringMVC對RESTfull的支持

    這篇文章主要介紹了淺談SpringMVC對RESTfull的支持,分享了相關(guān)配置代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • 詳解SpringBoot如何優(yōu)雅的處理免登錄接口

    詳解SpringBoot如何優(yōu)雅的處理免登錄接口

    在項目開發(fā)過程中,會有很多API接口不需要登錄就能直接訪問,比如公開數(shù)據(jù)查詢之類的,常規(guī)處理方法基本是 使用攔截器或過濾器,攔截需要認證的請求路徑,本文介紹一個更優(yōu)雅的方法自定義注解的方式,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Java?Mybatis查詢數(shù)據(jù)庫舉例詳解

    Java?Mybatis查詢數(shù)據(jù)庫舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java?Mybatis查詢數(shù)據(jù)庫的相關(guān)資料,在MyBatis中可以使用遞歸查詢實現(xiàn)對數(shù)據(jù)庫中樹形結(jié)構(gòu)數(shù)據(jù)的查詢,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Java并發(fā)編程必備之Synchronized關(guān)鍵字深入解析

    Java并發(fā)編程必備之Synchronized關(guān)鍵字深入解析

    本文我們深入探索了Java中的Synchronized關(guān)鍵字,包括其互斥性和可重入性的特性,文章詳細介紹了Synchronized的三種使用方式:修飾代碼塊、修飾普通方法和修飾靜態(tài)方法,感興趣的朋友一起看看吧
    2025-04-04

最新評論

辛集市| 连云港市| 当雄县| 娄烦县| 吴堡县| 奉节县| 盘山县| 郎溪县| 酒泉市| 明溪县| 长岭县| 高邑县| 恩平市| 巍山| 镇江市| 盐边县| 丹巴县| 新宾| 囊谦县| 山西省| 那曲县| 胶州市| 桐柏县| 安图县| 澄城县| 静宁县| 肃南| 贡嘎县| 荥经县| 宁夏| 靖江市| 洛隆县| 泰州市| 贺州市| 沾化县| 宁波市| 封开县| 富阳市| 灵宝市| 红河县| 嘉祥县|