Spring Security не удается найти источник данных

#java #mysql #authentication #spring-boot #spring-security

#java #mysql #аутентификация #spring-boot #spring-security

Вопрос:

Я новичок в 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]
  

Если я изменю тип аутентификации на in-memory и вручную установлю имя пользователя и пароль, аутентификация сработает.

Причина, по которой я так смущен, заключается в том, что я использую тот же метод setDataSource в другом классе DAO, который обрабатывает все операции CRUD с моей базой данных, и он работает так, как ожидалось. Что мешает моему классу SecurityConfig найти мой источник данных?

Ответ №1:

ваш пробный аннотат:

 @Autowired
private DataSource dataSource;
  

или

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

Комментарии:

1. Я определенно попробовал первый. Я думаю, поскольку я использую XML-подход, а не аннотированный компонент источника данных, простое автоматическое подключение источника данных для меня не сработало.

2. Однако второй метод я не рассматривал. Кажется, это работает, однако в моей IDE появляется красная закорючка, в которой говорится, что «не найдено компонентов типа «источник данных»». Однако моя трассировка стека больше не отображается, так что это может быть просто IntelliJ.

3. Я еще один, кто борется с этой проблемой в Intellij IDEA, где я думал, что предупреждение было реальной ошибкой компиляции. В любом случае, когда я запустил приложение даже с ошибкой в IDE, оно работало нормально.