Невозможно войти через базу данных H2, доступ к которой осуществляется через Hikari - PullRequest
0 голосов
/ 17 октября 2018

решено: я долго отлаживал, чтобы решить проблему с Spring, Hikari и H2.Этот пост должен поделиться моим решением.Больше не требуется помощь.

У меня было приложение Spring Boot со стандартной формой входа в систему.Данные об имени пользователя и пароле находились в базе данных H2, доступ к которой осуществлялся через Hikari.Я мог просматривать и редактировать свои данные в консоли H2, но вход в систему не работал, даже когда я предоставил правильные учетные данные.

Я запускал свое приложение в качестве автономного jar.Когда я перезапустил свое приложение, у меня все еще были старые данные в моей базе данных H2, хотя Spring должен удалить эти данные.

Вот основной класс:

package com.github.mhdirkse.timewriter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

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

    @Bean
    UserDetailsServiceImpl userDetailsService() {
        return new UserDetailsServiceImpl();
    }
}

Вот мойApplications.properties:

spring.jpa.database=default
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

# Datasource
spring.datasource.jdbcUrl=jdbc:h2:file:~/test2
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

logging.level.com.github.mhdirkse.=DEBUG

А вот мой UserDetailsServiceImpl ():

package com.github.mhdirkse.timewriter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import com.github.mhdirkse.timewriter.model.UserInfo;

public class UserDetailsServiceImpl implements UserDetailsService {
    private Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

    @Autowired
    private UserInfoRepository userInfoRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        logger.debug(String.format("Login requested with username %s", username));
        UserInfo user = userInfoRepository.findByUsername(username);
        if(user == null) {
            logger.debug("User not found in database");
            throw new UsernameNotFoundException(username);
        }
        logger.debug("Obtained user %s from database.", user.getUsername());
        return new UserPrincipal(user);
    }

}

Был получен следующий вывод консоли:

2018-10-17 18:41:52.026 DEBUG 10152 --- [nio-8080-exec-8] c.g.m.timewriter.UserDetailsServiceImpl  : Login requested with username mhdirkse
2018-10-17 18:41:52.186  INFO 10152 --- [nio-8080-exec-8] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
2018-10-17 18:41:53.261 DEBUG 10152 --- [nio-8080-exec-8] c.g.m.timewriter.UserDetailsServiceImpl  : User not found in database
2018-10-17 18:43:35.546 DEBUG 10152 --- [nio-8080-exec-7] c.g.m.timewriter.UserDetailsServiceImpl  : Login requested with username mhdirkse
2018-10-17 18:43:35.555 DEBUG 10152 --- [nio-8080-exec-7] c.g.m.timewriter.UserDetailsServiceImpl  : User not found in database

Я также запустил свойприложение с дополнительным журналом отладки, чтобы увидеть запрос SQL, который был применен во время входа в систему.Я скопировал этот запрос в консоль H2, и там он создал мои учетные данные для входа.

1 Ответ

0 голосов
/ 17 октября 2018

Ошибка в application.properties.Замените имя свойства spring.datasource.jdbcUrl на spring.datasource.url.Тогда application.properties становится:

spring.jpa.database=default
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

# Datasource
spring.datasource.url=jdbc:h2:file:~/test2
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

logging.level.com.github.mhdirkse.=DEBUG

Свойство spring.datasource.jdbcUrl определяется Hikari, а spring.datasource.url определяется Spring или Spring Boot.

С уважением,

Мартейн Дирксе

...