我创建了一个基于this tutorial的小型Web应用程序。原始版本按预期工作。然后我做了一些更改,它停止了工作,即我可以在不登录的情况下访问/ hello页面。我正在学习这个神奇的自动配置世界,我想了解我的代码和原始代码之间的关键区别。< / p>
所以我有初始化程序,因为我不需要main
这个东西,我只想要一个webapp:
public class Initializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class, SecurityConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
然后我有了这个:
//@EnableWebMvc
// I tried with and without this annotation, no difference
// I guess as I extend WebMvcConfigurerAdapter I don't need this
@ComponentScan
@Configuration
@EnableAutoConfiguration
public class WebConfig {
}
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("home");
registry.addViewController("/").setViewName("home");
registry.addViewController("/hello").setViewName("hello");
registry.addViewController("/login").setViewName("login");
}
}
最后这是安全部分:
@Configuration @EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/", "/home").permitAll()
.anyRequest().authenticated();
http.formLogin().loginPage("/login").permitAll().and().logout()
.permitAll();
}
@Configuration
protected static class AuthenticationConfiguration extends
GlobalAuthenticationConfigurerAdapter {
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password("password").roles("USER");
}
}
}
这些类都在同一个包中。如果有人解释我这是不起作用的原因,我会很高兴。
答案 0 :(得分:1)
SecurityConfig.class
需要位于根应用程序上下文中,而不是位于servlet应用程序上下文中;写下面的
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { SecurityConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
在Initializer
课程中。
您可以查看此博文:https://spring.io/blog/2013/07/03/spring-security-java-config-preview-web-security。