Spring Security 找不到数据源

Posted

技术标签:

【中文标题】Spring Security 找不到数据源【英文标题】:Spring Security cannot find DataSource 【发布时间】:2017-02-14 08:14:48 【问题描述】:

我是 Spring Boot 和 Spring Security 的新手,我正在尝试设置 Spring Security 以使用我来自 mysql 数据库的登录凭据。

SecurityConfig 类:

   @Service
   @Configuration
   @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter 

    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) 
        this.dataSource = dataSource;
    


@Override
protected void configure(HttpSecurity http) throws Exception 
    http
            .authorizeRequests().anyRequest().authenticated();
    http
            .formLogin().failureUrl("/login?error")
            .defaultSuccessUrl("/")
            .loginPage("/login")
            .permitAll()
            .and()
            .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login")
            .permitAll();


@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 

    auth
            .jdbcAuthentication().dataSource(dataSource)
            .usersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?")
            .authoritiesByUsernameQuery("SELECT username as username, enabled as authority FROM users WHERE username = ?");
    

spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDaoImpl" class="com.watchdog.dao.UserDaoImpl">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <!--<property name="url" value="jdbc:mysql://localhost:3306/bsbuckne" />-->
        <property name="url" value="jdbc:mysql://localhost:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="password" />
    </bean>
</beans>

我认为我的问题是我的数据源未被识别。我得到的堆栈跟踪是

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Property 'dataSource' is required
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:355) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]

如果我将身份验证类型更改为内存并手动设置用户名和密码,则身份验证有效。

我之所以如此困惑,是因为我在不同的 DAO 类中使用了相同的 setDataSource 方法,该类处理了我所有的数据库 CRUD 操作,并且它按预期工作。是什么让我的 SecurityConfig 类无法找到我的数据源?

【问题讨论】:

【参考方案1】:

你试过注释了吗:

@Autowired
private DataSource dataSource;

@Autowired
public void setDataSource(DataSource dataSource) 
    this.dataSource = dataSource;

【讨论】:

第一个我肯定试过了。我认为,由于我使用的是 XML 方法而不是带注释的数据源 bean,因此简单地自动装配数据源对我来说并不奏效。 第二种方法,但是我没有考虑过。它似乎正在工作,但是我的 IDE 中出现了一条红色波浪线,表示“找不到‘数据源’类型的 bean”。我的堆栈跟踪不再出现,所以它可能只是 IntelliJ。 我是另一个在 Intellij IDEA 中为这个问题而苦苦挣扎的人,我认为警告是一个真正的编译错误。无论如何,当我启动应用程序时,即使 IDE 出现错误,它也可以正常工作。

以上是关于Spring Security 找不到数据源的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular + Spring Security 应用程序中找不到错误

找不到 Spring Security 标记库

Spring Security 找不到 NamespaceHandler

添加“spring-security-taglibs”后jsp中仍然报错:找不到spring security标签的标签库描述符

找不到 org.springframework.security:spring-security-b om:jar:5.0.6.RELEASE

在简单的 Maven 项目中找不到依赖 spring-boot-starter-security