2017-03-05 108 views
1

我已经使用Spring Initializr,使用嵌入式Tomcat + Thymeleaf模板引擎生成了一个Spring Boot Web应用程序,并将其作为可执行JAR文件打包。使用Spring Boot - Spring security @ComponentScan或@Import

技术:

春季启动1.4.2.RELEASE,春天4.3.4.RELEASE,Thymeleaf 2.1.5.RELEASE,Tomcat的嵌入8.5.6时,Maven 3,Java的8

我有此安全类

com.tdk.config 

/** 
* @author nunito 
* @version 1.0 
* @since 4 mar. 2017 
*/ 
@Configuration 
@EnableWebSecurity 
@PropertySource("classpath:/com/tdk/config/app-${APP-KEY}.properties") 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    protected String loginPage = "/tdk/login"; 

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

     http 
      .formLogin() 
       .loginPage(getLoginPage()) 
       .permitAll() 
       .and() 
      .authorizeRequests() 
       .antMatchers("/mockup/**").permitAll() 
       .antMatchers("/welcome/**").authenticated() 
       .and() 
      .logout() 
       .permitAll() 
       .logoutSuccessUrl("/index.html"); 


    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .inMemoryAuthentication() 
       .passwordEncoder(new StandardPasswordEncoder()) 
       .withUser("nunito").password("08c461ad70fce6c74e12745931085508ccb2090f2eae3707f6b62089c634ddd2636f380f40109dfb").roles("ADMIN").and() 
       .withUser("nunito").password("4cfbf05e4493d17125c547fdba494033d7aceee9310f253f3e96c4f928333d2436d669d63a84fe4f").roles("ADMIN"); 
    } 

    public String getLoginPage() { 
     return loginPage; 
    } 

    public void setLoginPage(String loginPage) { 
     this.loginPage = loginPage; 
    } 

使用这个配置文件

@SpringBootApplication 
@ComponentScan(basePackages = "com.tdk.config") 
@EnableAutoConfiguration 
public class TdkCloudApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(TdkCloudApplication.class, args); 
    } 
} 

我有一个404,无论我存取权限S IN的URL

但这种配置一切正常

@SpringBootApplication 
@EnableAutoConfiguration 
@Import({SecurityConfig.class}) 
public class TdkCloudApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(TdkCloudApplication.class, args); 
    } 
} 

我想知道其中的差别,因为对我来说是两种不同的方式做同样认为

+0

您可以尝试删除'@EnableWebSecurity',因为它禁用了spring-boot自动配置,因为不需要'@ComponentScan',因为spring引导会扫描所有子包,不需要'@EnableAutoConfiguration' – Shahbour

回答

1

这是一个解释@Import@ComponentScan,这不是对您的问题的回答(因为我不知道为什么它不适用于ComponentScan),更像是一个提示。

@Import用于导入其他配置,因此如果一个类用@Configuration进行注释,并且在那里定义了一些bean,它们将被导入到应用程序上下文中,例如,

@Configuration 
public class config{ 
    @Bean 
    public ClassA a(){ 
     return new ClassA(); 
    } 
} 

@Import({config.Class}) // import Bean for ClassA 

@ComponentScan扫描与@Component@Service@Repository注释的所有类,并具有映射到每个类别的一对一豆。 例如

@Component 
public class ClassB {} 

@ComponentScan // import Bean ClassB 

春季的4.2版本后,@ComponentScan也可以扫描@Configuration成组件。所以在你的情况下,SecurityConfig也应该作为一个组件导入到上下文中,而不是作为一个配置。

我唯一不明白的地方是@Import如何触发SecurityConfig中的代码的执行,如果有人知道它,请给出评论。