这些关键字有很多答案,但似乎没有什么能解决我的问题。我可能不会“得到它”,但是目前我无法从其他解决方案中了解到的任何信息在我的特定情况下都可以正常工作。
由于我们使用的是一种部署方法,因此必须取消Spring Bootify应用程序的安装,这意味着必须显式设置Tomcat并处理Spring Boot会为您带来的所有烦恼。
我对此感兴趣的依赖项是:
spring (core, etc) 3.2.13.RELEASE
spring-security (core, web, config) 3.2.9.RELEASE
tomcat-embed-core 7.0.67
我在主要方法中设置了Tomcat,并在其中设置了所有上下文:
final Tomcat tomcat = new Tomcat();
tomcat.setPort(serverPort);
final Context container = tomcat.addContext(contextRootPath, staticFileDocumentBaseDirectoryAbsolutePathStr);
final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.setDisplayName("rootContext");
rootContext.register(CommonBeans.class);
rootContext.register(ApplicationBeans.class);
final AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
dispatcherContext.setDisplayName("dispatcherContext");
dispatcherContext.register(MvcConfig.class);
dispatcherContext.scan("app.configuration.controllers");
final DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext);
final Wrapper wrapper = Tomcat.addServlet(container, APPLICATION_NAME, dispatcherServlet);
wrapper.setLoadOnStartup(1);
container.addServletMapping("/", APPLICATION_NAME);
tomcat.start();
我的MVCConfig类导入SecurityConfiguration类
@Configuration
@EnableWebMvc
@Import({ SecurityBeans.class, SecurityConfiguration.class, ThymeleafConfig.class })
public class MvcConfig extends WebMvcConfigurerAdapter {
addResourceHandlers().......
}
我的安全配置如下:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired(required = true)
@Qualifier("realAuthProvider")
private AuthenticationProvider authenticationProvider;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
.antMatchers("/css/**", "/images/**", "/js/**", "/fonts/**", "/less/**", "/webjars/**", "/login", "/logout", "/404", "/403", "/formlyHtml/**").permitAll()
.antMatchers("/**").authenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error=bad_credentials")
.defaultSuccessUrl("/")
.and()
.exceptionHandling().accessDeniedPage("/403")
.and()
.logout()
.invalidateHttpSession(true)
.deleteCookies("JSESSIONID")
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.and()
.csrf().disable();
}
}
现在,从这开始,我希望映射到“ /”的控制器将需要身份验证,并且Spring Security应该重定向到“ login”,在其中将显示我漂亮的登录页面,但它不会重定向,只是直接指向“ /”控制器,该控制器将触发Null指针,因为在上下文中不存在经过身份验证的用户。
我已经读过有关SecurityConfig可能未分配给正确上下文的信息,但是查看我的主要Tomcat设置后,我认为我会在那里正确处理此问题。唯一的混合可能是因为Mvc控制器需要从应用程序bean(CommonBeans和ApplicationBeans)自动关联的依赖项,所以我需要在它们的@Controller注释之后导入这些类。
我也有一个类-SpringSecurityInitializer扩展了AbstractSecurityWebApplicationInitializer-与MvcConfig驻留在同一软件包中,但是似乎未加载(但是我不知道在我的配置中引用该魔术是什么)
有人可以告诉我为什么我在这里看到的东西使我的Spring Security配置不能与我的控制器一起使用吗?
谢谢
最佳答案
您是否已初始化Spring安全性?
您需要创建一个extends
AbstractSecurityWebApplicationInitializer的类。
这会自动加载springSecurityFilterChain,并注册DelegatingFilterProxy
以使用springSecurityFilterChain
在其他已注册过滤器之前(基本上,它将把Spring安全性放在请求的“方式”中):
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {}
我还将删除:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
您已经在配置中的覆盖方法中配置了
authenticationProvider
。有关示例,请参见here。