我的Spring SecurityConfig没有被接收

时间:2014-08-20 18:08:59

标签: java spring spring-mvc spring-security spring-boot

我创建了一个基于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");
        }

    }
}

这些类都在同一个包中。如果有人解释我这是不起作用的原因,我会很高兴。

1 个答案:

答案 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