Загрузка свойств с тем же префиксом в Spring Security с помощью Spring Boot - PullRequest
0 голосов
/ 14 апреля 2020

Я аутентифицирую приложение на странице входа в систему, используя Spring Seurity и Spring Boot. Я храню учетные данные пользователя в файле свойств (до тех пор, пока мы не завершим работу с базой данных) с паролем в зашифрованном виде для запуска 5 пользователей.

Вот мой файл свойств

User.properties

my.web.user[0].username=John
my.web.user[0].password=$2y$12$V
my.web.user[0].role=ADMIN,USER

my.web.user[1].username=Johny
my.web.user[1].password=$2y$12$5C
my.web.user[1].role=ADMIN,USER

my.web.user[2].username=McCain
my.web.user[2].password=$2y$12$ERL8mf5.
my.web.user[2].role=USER

Так что теперь мы можем добавить столько пользователей, сколько мы хотим, но в этом формате массива. Теперь я загружаю этот файл свойств в Spring Boot.

MyWebApplication. java

@SpringBootApplication
@ComponentScan(basePackages = { "com.myorg.module" })
@EnableConfigurationProperties(UserConfig.class)  
public class MyWebApplication {

    public static void main(String[] args) {

        ApplicationContext appCtxt = SpringApplication.run(MyWebApplication.class, args);
    }
}

UserConfig. java

@Configuration
@PropertySource("user.properties")
@ConfigurationProperties(prefix="my.web")
public class UserConfig {

    private List<User> user;

    /**
     * @return the user
     */
    public List<User> getUser() {
        return user;
    }

    /**
     * @param user the user to set
     */
    public void setUser(List<User> user) {
        this.user = user;
    }

}

UserDetailsServiceImpl

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User.UserBuilder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

import UserConfig;
import User;

@Component
public class UserDetailsServiceImpl implements UserDetailsService{

    @Autowired
    private UserConfig userConfig;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User user = findUserByUsername(username);
        UserBuilder userBuilder = null;

        if(user != null) {
            userBuilder = org.springframework.security.core.userdetails.User.withUsername(username);
            userBuilder.password(new BCryptPasswordEncoder().encode(user.getPassword()));
            userBuilder.roles(user.getRoles());
        }else {
            throw new UsernameNotFoundException("User Not Found");
        }

        return userBuilder.build();
    }

    private User findUserByUsername(String username) {
        System.out.println(userConfig);
        return userConfig.getUser().get(0);
    }

}

Теперь, когда я загружаю UserConfig в свой UserDetailsServiceImpl, используя @Autowired. В этом случае я получаю userConfig как ноль. Однако, когда я помещаю точки отладки в getter / setter в UserConfig. Я вижу, что это при заполнении объекта со свойствами содержимого при запуске контейнера. Но позже он исчезает и делает его пустым.

Может кто-нибудь сообщить мне, где я делаю ошибку?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 апреля 2020

Есть несколько уроков, которые я получил по этому вопросу.

  1. WebSecurityConfigurerAdapter подкласс - Этот дочерний класс должен иметь @Autowired интерфейс UserDetailsService. В моем случае я написал UserDetailsServiceImpl, который является реализацией интерфейса UserDetailsService.
  2. Имя ключа массива Properties должно совпадать с именем переменной класса @Configuration. В моем случае в свойствах у меня было

    my.web. user [0] .username = John

и имя переменной должно быть таким же в классе @Configuration, как

@Configuration
@ConfigurationProperties(prefix="my.web")
@PropertySource("user.properties")
public class UserConfig {

    private List<User> **user**;

А потом он неожиданно начал работать.

PS - я много гуглил и исследовал, но ничего не получалось. Затем я прочитал этот документ 3 раза, чтобы он работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...