在多个地方配置 Spring Security

我显然可以通过在其方法中实现单个WebSecurityConfigurerAdapter和访问来使用 Spring Security 的全部功能。但这会导致整体实现,并且如果不为此实施自定义措施,就无法跨应用程序模块进行传播。HttpSecurityconfigure

因此,可能会想实现多个WebSecurityConfigurerAdapter子类。但这会导致HttpSecurity对象重复,尝试重新配置一些基本方面(例如 csrf),并且无法正确修改已在第一个适配器中配置的内容。即使禁用默认值也无济于事。

因此,我的问题是:是否有在独立配置/组件类中指定 http 安全性的 Spring 或 Spring-Boot 方式?(所以 Java 不是 xml 配置)一个例子可能是在链的中间添加一个安全过滤器。另一个更改 csrf(例如会话到 cookie),而单独的另一个类只会保留默认值。


RISEBY
浏览 251回答 1
1回答

哈士奇WWW

我不认为有这样做的直接方法。但是我们仍然可以在我们的项目架构中强制它这样做。我们通常从 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 {&nbsp; &nbsp; void configure(AuthenticationManagerBuilder auth) throws Exception;&nbsp; &nbsp; void configure(WebSecurity web) throws Exception;&nbsp; &nbsp; void configure(HttpSecurity http) throws Exception;}@Configurationpublic abstract class BaseSecurityConfig implements IBaseSecurityConfig {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void configure(AuthenticationManagerBuilder auth) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; // TODO Any defaults&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void configure(WebSecurity web) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; // TODO Any defaults&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void configure(HttpSecurity http) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; // TODO Any defaults&nbsp; &nbsp; }}现在我们将通过扩展 BaseSecurityConfig 在任何地方声明我们的安全配置。假设我们声明 WebSecurityConfiguration1 如下。@Configurationpublic class WebSecurityConfiguration1 extends BaseSecurityConfig {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void configure(HttpSecurity http) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; http.authorizeRequests().antMatchers("/css/**", "/js/**", "/admin/**").permitAll().anyRequest().authenticated()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .and()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .formLogin().loginPage("/login").permitAll().and().logout().logoutSuccessUrl("/");&nbsp; &nbsp; }}现在我们将在其他任何地方声明一个单独的安全配置。让我们称之为 WebSecurtiyConfiguration2。@Configurationpublic class WebSecurtiyConfiguration2 extends BaseSecurityConfig {&nbsp; &nbsp; @Override&nbsp; &nbsp; public void configure(HttpSecurity http) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; IsSecureFilter i1 = new IsSecureFilter();&nbsp; &nbsp; &nbsp; &nbsp; http.addFilterBefore(i1, ChannelProcessingFilter.class);&nbsp; &nbsp; }}现在我们必须自动配置上述两个声明的安全配置。我们将在我们的父项目中进行,或者您可以说我们将在 SecurityConfig 的实际实例中配置它们,如下所示。@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private List<IBaseSecurityConfig> securityConfigs;&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void configure(AuthenticationManagerBuilder auth) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; for(IBaseSecurityConfig secConfig : securityConfigs) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; secConfig.configure(auth);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void configure(WebSecurity web) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; for(IBaseSecurityConfig secConfig : securityConfigs) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; secConfig.configure(web);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected void configure(HttpSecurity http) throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println("CONFIGURING FROM BASE");&nbsp; &nbsp; &nbsp; &nbsp; for(IBaseSecurityConfig secConfig : securityConfigs) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; secConfig.configure(http);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}现在这是我们的应用程序加载类。我们必须确保没有其他 WebSecurityConfigurerAdapter 加载,只有我们的父实例被加载。我们通过@Component-> 排除过滤器来做到这一点。在@Import 的帮助下,将确保只有我们的实例被加载。@SpringBootApplication@EnableCaching@ComponentScan(excludeFilters = @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE,classes=WebSecurityConfigurerAdapter.class))@Import(SecurityConfig.class)public class DemoApplication {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; SpringApplication.run(DemoApplication.class, args);&nbsp; &nbsp; }}现在,您已经强制您的架构通过仅扩展 BaseSecurityConfig 来声明任何安全配置,并且您可以在不同的位置执行此操作。但请注意,如果发生冲突,这可能会覆盖彼此的配置。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java