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

Spring?Security配置保姆級(jí)教程

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

背景

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

一、前言

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

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

二、配置HttpSecurity

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

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

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

但今后, WebSecurityConfigurerAdapter 就被 Spring 官方棄用了,取而代之的是通過(guò)注冊(cè)一個(gè) SecurityFilterChain 的 Bean 來(lái)配置 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 是一個(gè)回調(diào)接口,可以用來(lái)配置 WebSecurity

首先來(lái)看看先前的舊配置風(fēng)格的代碼示例:使用 WebSecurityConfigurerAdapter 來(lái)忽略與 /ignore1/ignore2 匹配的請(qǐng)求 (即不攔截這兩個(gè)請(qǐng)求進(jìn)行認(rèn)證授權(quán)) 。

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

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

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

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

四、配置LDAP認(rèn)證

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

在 Spring Security 5.7 中,Spring 官方新增了 EmbeddedLdapServerContextSourceFactoryBeanLdapBindAuthenticationManagerFactoryLdapPasswordComparisonAuthenticationManagerFactory ,用來(lái)創(chuàng)建一個(gè)嵌入式 LDAP 服務(wù)器和一個(gè) AuthenticationManager 對(duì)象,來(lái)執(zhí)行 LDAP 認(rèn)證。

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

@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 官方不再推薦上面的配置風(fēng)格,取而代之的是使用新的 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認(rèn)證

同樣的,先來(lái)看先前舊的配置風(fēng)格的示例,繼承 WebSecurityConfigurerAdapter ,使用一個(gè)以默認(rèn)方式初始化且具有一個(gè)用戶的嵌入式 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 官方不再推薦上面的配置風(fēng)格,取而代之的是向 Spring 容器注入一個(gè) 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() 。在實(shí)際的生產(chǎn)環(huán)境中并不會(huì)使用默認(rèn)的密碼編碼器,因?yàn)檫@樣存儲(chǔ)的密碼是明文,十分不安全。這里推薦使用 BCryptPasswordEncoder 作為密碼編碼器來(lái)對(duì)密碼進(jìn)行加密成暗文存儲(chǔ)。

六、In-Memory Authentication

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

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

@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 官方不再推薦上面的配置風(fēng)格,取而代之的是向 Spring 容器注入一個(gè) 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() 。在實(shí)際的生產(chǎn)環(huán)境中并不會(huì)使用默認(rèn)的密碼編碼器,因?yàn)檫@樣存儲(chǔ)的密碼是明文,十分不安全。這里推薦使用 BCryptPasswordEncoder 作為密碼編碼器來(lái)對(duì)密碼進(jìn)行加密成暗文存儲(chǔ)。

七、配置全局AuthenticationManager

如果你想要?jiǎng)?chuàng)建整個(gè)應(yīng)用都可以調(diào)用的 AuthenticationManager 對(duì)象,只需要簡(jiǎn)單地使用注解 @Bean 來(lái)注入 Spring 容器。

配置風(fēng)格示例與 LDAP 的配置示例相同。

八、配置局部AuthenticationManager

在 Spring Security 5.6 中,Spring 官方在 HttpSecurity 中新增了方法 authenticationManager() ,該方法重寫具體的 SecurityFilterChain 的默認(rèn) 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 來(lái)調(diào)用局部 AuthenticationManager 。這實(shí)際上正是 Spring Security 內(nèi)部實(shí)現(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();
    }
}

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

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

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

相關(guān)文章

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

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

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

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

    下面小編就為大家?guī)?lái)一篇老生常談java垃圾回收算法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java8深入學(xué)習(xí)系列(一)lambda表達(dá)式介紹

    Java8深入學(xué)習(xí)系列(一)lambda表達(dá)式介紹

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

    Spring成員對(duì)象注入的三種方式詳解

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

    Java SpringBoot自動(dòng)裝配原理詳解及源碼注釋

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

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

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

    淺談SpringMVC對(duì)RESTfull的支持

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

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

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

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

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

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

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

最新評(píng)論

湘潭县| 额尔古纳市| 泰宁县| 汕头市| 开封市| 锡林浩特市| 汝州市| 辰溪县| 台中市| 宾川县| 汶川县| 柘城县| 清流县| 颍上县| 庄浪县| 曲阜市| 梅河口市| 大化| 双峰县| 达孜县| 东光县| 吴江市| 大渡口区| 苗栗县| 安西县| 麻栗坡县| 西充县| 财经| 淮安市| 荣成市| 沙洋县| 永昌县| 大名县| 渭源县| 资兴市| 信丰县| 泰和县| 六盘水市| 泸定县| 永仁县| 天长市|