亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在多個地方配置 Spring Security

在多個地方配置 Spring Security

RISEBY 2022-06-08 17:41:48
我顯然可以通過在其方法中實現單個WebSecurityConfigurerAdapter和訪問來使用 Spring Security 的全部功能。但這會導致整體實現,并且如果不為此實施自定義措施,就無法跨應用程序模塊進行傳播。HttpSecurityconfigure因此,可能會想實現多個WebSecurityConfigurerAdapter子類。但這會導致HttpSecurity對象重復,嘗試重新配置一些基本方面(例如 csrf),并且無法正確修改已在第一個適配器中配置的內容。即使禁用默認值也無濟于事。因此,我的問題是:是否有在獨立配置/組件類中指定 http 安全性的 Spring 或 Spring-Boot 方式?(所以 Java 不是 xml 配置)一個例子可能是在鏈的中間添加一個安全過濾器。另一個更改 csrf(例如會話到 cookie),而單獨的另一個類只會保留默認值。
查看完整描述

1 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

我不認為有這樣做的直接方法。但是我們仍然可以在我們的項目架構中強制它這樣做。


我們通常從 WebSecurityConfigurerAdapter 為我們的配置覆蓋主要有 3 個方法。1. 配置(AuthenticationManagerBuilder auth) 2. 配置(WebSecurity web) 3. 配置(HttpSecurity http)


根據 Spring 安全架構,只能使用一個 WebSecurityConfigurer 實例。


我們可以這樣設計: 1. 使用這個規則,我們可以讓我們的父項目持有這個 WebsecurityConfigurer 實例。2. 我們可以讓 IBaseSecurityConfig 具有以上 3 個方法簽名。3. 我們將忽略任何其他 WebsecurityConfigurer 實例,只允許父 WebsecurityConfigurer 實例。4.我們可以將IBaseSecurityConfig抽象實現為BaseSecurityConfig。


就像 Spring 對我們強制實施 WebsecurityConfigurer 一樣,您可以在項目模塊上強制 BaseSecurityConfig 覆蓋任何與安全相關的配置。


我將嘗試用一個例子來解釋它。


public interface IBaseSecurityConfig {


    void configure(AuthenticationManagerBuilder auth) throws Exception;

    void configure(WebSecurity web) throws Exception;

    void configure(HttpSecurity http) throws Exception;


}



@Configuration

public abstract class BaseSecurityConfig implements IBaseSecurityConfig {


    @Override

    public void configure(AuthenticationManagerBuilder auth) throws Exception {

        // TODO Any defaults


    }


    @Override

    public void configure(WebSecurity web) throws Exception {

        // TODO Any defaults


    }


    @Override

    public void configure(HttpSecurity http) throws Exception {

        // TODO Any defaults


    }

}

現在我們將通過擴展 BaseSecurityConfig 在任何地方聲明我們的安全配置。假設我們聲明 WebSecurityConfiguration1 如下。


@Configuration

public class WebSecurityConfiguration1 extends BaseSecurityConfig {


    @Override

    public void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/css/**", "/js/**", "/admin/**").permitAll().anyRequest().authenticated()

                .and()

                .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class)

                .formLogin().loginPage("/login").permitAll().and().logout().logoutSuccessUrl("/");

    }

}

現在我們將在其他任何地方聲明一個單獨的安全配置。讓我們稱之為 WebSecurtiyConfiguration2。


@Configuration

public class WebSecurtiyConfiguration2 extends BaseSecurityConfig {


    @Override

    public void configure(HttpSecurity http) throws Exception {

        IsSecureFilter i1 = new IsSecureFilter();

        http.addFilterBefore(i1, ChannelProcessingFilter.class);

    }

}

現在我們必須自動配置上述兩個聲明的安全配置。我們將在我們的父項目中進行,或者您可以說我們將在 SecurityConfig 的實際實例中配置它們,如下所示。


@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {



    @Autowired

    private List<IBaseSecurityConfig> securityConfigs;


    @Override

    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        for(IBaseSecurityConfig secConfig : securityConfigs) {

            secConfig.configure(auth);          

        }

    }


    @Override

    public void configure(WebSecurity web) throws Exception {

        for(IBaseSecurityConfig secConfig : securityConfigs) {

            secConfig.configure(web);

        }


    }


    @Override

    protected void configure(HttpSecurity http) throws Exception {

        System.out.println("CONFIGURING FROM BASE");

        for(IBaseSecurityConfig secConfig : securityConfigs) {

            secConfig.configure(http);

        }

    }

}

現在這是我們的應用程序加載類。我們必須確保沒有其他 WebSecurityConfigurerAdapter 加載,只有我們的父實例被加載。我們通過@Component-> 排除過濾器來做到這一點。在@Import 的幫助下,將確保只有我們的實例被加載。


@SpringBootApplication

@EnableCaching

@ComponentScan(excludeFilters = @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,classes=WebSecurityConfigurerAdapter.class))

@Import(SecurityConfig.class)

public class DemoApplication {


    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

    }

}

現在,您已經強制您的架構通過僅擴展 BaseSecurityConfig 來聲明任何安全配置,并且您可以在不同的位置執行此操作。


但請注意,如果發生沖突,這可能會覆蓋彼此的配置。


查看完整回答
反對 回復 2022-06-08
  • 1 回答
  • 0 關注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號