gpt4 book ai didi

spring-mvc - 如何使用 XML 和 Java 配置实现 Spring Security 4

转载 作者:行者123 更新时间:2023-12-03 11:33:04 24 4
gpt4 key购买 nike

我正在尝试将 Spring-Security 4 实现到我的 Spring MVC web 和 rest 应用程序中。我添加了 2 个类来启用 Spring Security 的 java 配置方式。我仍然想保留我的 web.xml 并且不更改整个项目以使用 java 配置。一旦我这样做,我就会收到以下错误:

29-May-2015 08:47:12.826 SEVERE [localhost-startStop-1]  
org.apache.catalina.core.StandardContext.filterStart Exception starting
filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean
named 'springSecurityFilterChain' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.
getBeanDefinition(DefaultListableBeanFactory.java:687)

如您所见,它表示无法识别 springSecurityFilterChain。这当然应该由@EnableWebSecurity 启用,如下所示:

用于 Spring Security 的类:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("abc").password("123456").roles("USER");
auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
auth.inMemoryAuthentication().withUser("dba").password("123456").roles("DBA");
}

@Override
protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
.and().formLogin();

}
}

public class SpringSecurityInitializer extends AbstractSecurityWebApplicationInitializer {
//do nothing
}

奇怪的是,如果我将 springSecurityFilterChain 添加到我的 web.xml,在运行时它会提示并说有一个重复的 springSecurityFilterChain。我注意到最终在 Java 配置中,他们这样做:
public class MvcWebApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { SecurityConfig.class };
}

他们在 MvcWebApp 的 Java 配置中注册 SecurityConfig。
这基本上使它成为我相信的 servlet 上下文的一部分。

总而言之,我如何才能识别我的 springSecurityFilterChain?我是否需要在 web.xml 或现有应用程序上下文中注册我的 SecurityConfig 类?

我认为这可能是第一个问题区域:
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {

}

Spring 文档说:

Instead, we should register Spring Security with the existing ApplicationContext. For example, if we were using Spring MVC our SecurityWebApplicationInitializer.



这是否意味着在我的情况下,我可以使用 SecurityConfig 并且应该将其设为 bean?或者它不是已经是一个 bean,因为它可以通过 @Configuration 发现?

如何在使用新的 Java 配置的同时通过 XML 识别 SecurityConfig?

最佳答案

感谢 ArunM,我重新审视了我的问题,现在有了 XML 和 Java 配置组合。 Spring MVC 和 web 应用程序确实使用 web.xml 和 default-servlet.xml PLUS 一个导入 Spring Security 的 java 配置应用程序类。

@Configuration
@Import({ SecurityConfig.class})
@ImportResource( {"classpath:web-context.xml",
"classpath:service-context.xml","classpath:data-context.xml"})
public class AppConfig {
public AppConfig() {
super();
}
}

我使用 @Import 注释导入 Spring Security SecurityConfig 类。

我还通过注释对所有上下文文件进行 contextConfigLocation 扫描:@ImportResource。

诀窍不是通过 contextConfigLocation 加载 SecurityConfig,而是创建一个 AppConfig 类,该类通过将所有内容包含在其中来设置应用程序上下文。

关于spring-mvc - 如何使用 XML 和 Java 配置实现 Spring Security 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30536938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com