SpringBoot - 安全管理框架Spring Security使用詳解(8)-配置多個HttpSecurity

 在之前的文章中我們都只配置一個 HttpSecurity,如果業務比較複雜,我們也可以配置多個 HttpSecurity,實現對 WebSecurityConfigurerAdapter 的多次擴展。

 

八、配置多個 HttpSecurity

1,樣例代碼

(1)配置多個 HttpSecurity 時,MultiHttpSecurityConfig 不需要繼承 WebSecurityConfigurerAdapter,而是在 MultiHttpSecurityConfig 中創建靜態內部類繼承 WebSecurityConfigurerAdapter 即可。

注意:靜態內部類上添加 @Configuration 註解和 @Order 註解,@Order 註解表示該配置的優先級,數字越小優先級越大,未加 @Order 註解的配置優先級最小。

(2)這裏我們創建了兩個靜態內部類來配置兩個不同的 HttpSecurity,一個用來處理“/admin/**”模式的 URL,另一個處理其它的 URL。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

@Configuration

public class MultiHttpSecurityConfig{

    // 指定密碼的加密方式

    @SuppressWarnings("deprecation")

    @Bean

    PasswordEncoder passwordEncoder(){

        // 不對密碼進行加密

        return NoOpPasswordEncoder.getInstance();

    }

 

    // 配置用戶及其對應的角色

    @Autowired

    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.inMemoryAuthentication()

                .withUser("root").password("123").roles("DBA")

                .and()

                .withUser("admin").password("123").roles("ADMIN")

                .and()

                .withUser("hangge").password("123").roles("USER");

    }

 

    // 下面配置專門用來處理 "/admin/**" 模式的URL

    @Configuration

    @Order(1)

    public static class AdminSecurityConfig

            extends WebSecurityConfigurerAdapter {

        @Override

        protected void configure(HttpSecurity http) throws Exception {

            http.antMatcher("/admin/**").authorizeRequests()

                    .anyRequest().hasRole("ADMIN");

        }

    }

 

    // 下面配置用來處理其它的URL

    @Configuration

    public static class OtherSecurityConfig

            extends WebSecurityConfigurerAdapter{

        @Override

        protected void configure(HttpSecurity http) throws Exception {

            http.authorizeRequests() // 開啓 HttpSecurity 配置

                .anyRequest().authenticated() // 用戶訪問其它URL都必須認證後訪問(登錄後訪問)

                .and().formLogin().loginProcessingUrl("/login").permitAll()//開啓表單登錄並配置登錄接口

                .and().csrf().disable(); // 關閉csrf

        }

    }

}

 

2,運行測試

(1)啓動項目,我們使用 root 用戶進行登錄,所以登錄後可以訪問除 /admin/* 外所有接口。

原文:SpringBoot - 安全管理框架Spring Security使用詳解8(配置多個HttpSecurity)

 

(2)而由於 /admin/hello 接口需要 ADMIN 角色,因此 root 用戶仍然無法訪問。

原文:SpringBoot - 安全管理框架Spring Security使用詳解8(配置多個HttpSecurity)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章