首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Boot - Spring安全@ComponentScan或@Import

Spring Boot - Spring安全@ComponentScan或@Import
EN

Stack Overflow用户
提问于 2017-03-05 16:08:00
回答 2查看 6.5K关注 0票数 2

我已经使用Spring Initializr生成了一个Spring Boot web应用程序,使用嵌入式Tomcat + Thymeleaf模板引擎,并打包为一个可执行的JAR文件。

使用的技术:

Spring Boot 1.4.2.RELEASE,Spring 4.3.4.RELEASE,Thymeleaf 2.1.5.RELEASE,Tomcat Embed 8.5.6,Maven 3,Java 8

我有一个安全类

代码语言:javascript
复制
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;
    }

使用此配置文件

代码语言:javascript
复制
@SpringBootApplication
@ComponentScan(basePackages = "com.tdk.config")
@EnableAutoConfiguration
public class TdkCloudApplication {

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

我在URL中访问的任何地方都有一个404

但是这个配置一切正常

代码语言:javascript
复制
@SpringBootApplication
@EnableAutoConfiguration
@Import({SecurityConfig.class})
public class TdkCloudApplication {

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

我想知道其中的区别,因为对我来说是两种不同的方式做完全相同的想法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-05 21:52:00

这是对@Import@ComponentScan的解释,这不是对你的问题的回答(因为我不知道为什么它不能与ComponentScan一起工作),更像是对它的一个提示。

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

代码语言:javascript
复制
@Configuration
public class config{
    @Bean
    public ClassA a(){
        return new ClassA();
    }
}

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

@ComponentScan扫描所有用@Component@Service@Repository注释的类,并将一对一的bean映射到每个类。例如:

代码语言:javascript
复制
@Component
public class ClassB {}

@ComponentScan // import Bean ClassB

在Spring4.2版本之后,@ComponentScan还可以将@Configuration作为一个组件进行扫描。因此,在您的示例中,SecurityConfig也应该作为组件而不是配置导入到上下文中。

我唯一不太理解的是@Import是如何触发SecurityConfig中代码的执行的,如果有人知道这一点,请发表评论。

票数 3
EN

Stack Overflow用户

发布于 2020-07-21 15:38:39

抱歉,回复晚了。但这可能会对某些人有帮助。问题中没有包含"TdkCloudApplication“这个包。我假设,它与"com.tdk.config“在不同的包中。如果是这样,那么在@ComponentScan()注释中,您必须给出TdkCloudApplication包和"SecurityConfig“包。

就像这样。@组件扫描(basePackages= {"com.tdk.config","packageName of TdkCloudApplication"})。

这是因为@SpringBootApplication。默认情况下,它将扫描该包及其子包中的bean。但是如果我们用@ComponentScan注释这个类,那么我们必须给出我们需要的所有包,这样spring就会签入所有这些区域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42606002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档