Spring Security-没有类型为'的合格bean;DataSource';可用:至少需要1个符合autowire候选资格的bean
我试图重复Spring安全文档中的内容,并试图保护一个网页作为测试。我严格按照spring编写的文档来做每件事Spring Security-没有类型为'的合格bean;DataSource';可用:至少需要1个符合autowire候选资格的bean,spring,spring-security,Spring,Spring Security,我试图重复Spring安全文档中的内容,并试图保护一个网页作为测试。我严格按照spring编写的文档来做每件事 但它不起作用。我已经被这个问题折磨了7天了。我快疯了。 我不知道该怎么办,也不知道如何克服这个错误。它发生在项目的装配阶段。 谁能帮忙。 以下是错误日志: MessageWebApplicationInitializer.class 包com.concretepage.security @Override protected Class<?>[] getRoo
但它不起作用。我已经被这个问题折磨了7天了。我快疯了。 我不知道该怎么办,也不知道如何克服这个错误。它发生在项目的装配阶段。 谁能帮忙。
以下是错误日志:
MessageWebApplicationInitializer.class
包com.concretepage.security
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{ WebSecurityConfig.class, SQLConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{FreeMarkerConfig.class };
}
// ...
SecurityWebApplicationInitializer.class
WebSecurity配置类
包com.com页面 HomeController.class
xml
4.0.0
com.cn网页
混凝土页
1.0-快照
org.apache.maven.plugins
maven编译器插件
3.8.1
${java.version}
${java.version}
${encoding}
UTF-8
假的
1.8
UTF-8
org.springframework
spring框架bom表
5.2.3.1发布
聚甲醛
进口
org.springframework.security
spring安全bom表
5.2.2.1发布
聚甲醛
进口
org.springframework.security
spring安全内核
org.springframework.security
spring安全网
org.springframework.security
spring安全配置
org.springframework
SpringJDBC
org.springframework
SpringWebMVC
org.springframework
spring上下文支持
javax.servlet
javax.servlet-api
4.0.1
mysql
mysql连接器java
8.0.19
org.freemarker
自由标记
2.3.29
显然,您的WebSecurityConfig
在SQLConfig
中找不到bean。修改消息WebApplicationInitializer
;尝试将SQLConfig.class
放入getRootConfigClasses()
:
@覆盖
受保护类[]getRootConfigClasses(){
返回新类[]{WebSecurityConfig.Class,SQLConfig.Class};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{FreeMarkerConfig.Class};
}
// ...
getRootConfigClasses()
中的所有配置类都用于创建父应用程序上下文,而getServletConfigClasses()
中的配置类是子上下文。子上下文可以@Autowire
根上下文bean,但不能反过来
查看更多信息在此
package com.concretepage.config;
package com.concretepage.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; @Configuration @ComponentScan({"com.concretepage"}) public class FreeMarkerConfig { @Bean public FreeMarkerConfigurer freeMarkerConfigurer() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("/WEB-INF/templates"); configurer.setDefaultEncoding("UTF-8"); return configurer; } @Bean public ViewResolver getViewResolver(){ FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); viewResolver.setSuffix(".ftl"); viewResolver.setContentType("text/html;charset=UTF-8"); viewResolver.setCache(false); return viewResolver; } }
package com.concretepage.config;import com.concretepage.security.WebSecurityConfig; import org.springframework.core.annotation.Order; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; @Order(1) public class MessageWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{ WebSecurityConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{ SQLConfig.class, FreeMarkerConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
package com.concretepage.security;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; @Configuration @ComponentScan("com.concretepage.security") public class SQLConfig { public SQLConfig() { } @Bean public DataSource dataSource() { DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource(); driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); driverManagerDataSource.setUrl("jdbc:mysql://localhost:3306/mysecurity?serverTimezone=UTC"); driverManagerDataSource.setUsername("root"); driverManagerDataSource.setPassword("1234"); return driverManagerDataSource; } }
package com.concretepage.security;import org.springframework.core.annotation.Order; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; @Order(2) public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }
package com.concretepage;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.*; import org.springframework.security.core.userdetails.User; import javax.sql.DataSource; @EnableWebSecurity public class WebSecurityConfig { @Autowired public DataSource dataSource; @Autowired public void configure(AuthenticationManagerBuilder auth) throws Exception { // ensure the passwords are encoded properly User.UserBuilder user = User.builder(); auth .jdbcAuthentication() .dataSource(dataSource) .withDefaultSchema() .withUser(user.username("user").password("{noop}password").roles("USER")) .withUser(user.username("admin").password("{noop}password").roles("USER","ADMIN")); } }
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home () { return "/home"; } @GetMapping("/login") public String login () { return "/login"; } }
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.concretepage</groupId> <artifactId>ConcretePage</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${encoding}</encoding> </configuration> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <failOnMissingWebXml>false</failOnMissingWebXml> <java.version>1.8</java.version> <encoding>UTF-8</encoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.2.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-bom</artifactId> <version>5.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring Security--> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> </dependency> <!-- Spring Framework--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.29</version> </dependency> </dependencies> </project>
@Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[]{ WebSecurityConfig.class, SQLConfig.class}; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[]{FreeMarkerConfig.class }; } // ...