#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, оно работало нормально.