Инициализация репозиториев, защищенных аутентификацией Spring - PullRequest
0 голосов
/ 27 мая 2019

Я использую Spring Boot Data REST для сопоставления репозиториев объектов Hibernate с маршрутами REST. Я также использую аннотацию Spring Security @PreAuthorize для защиты определенных методов этих репозиториев. Это прекрасно работает во время производства, но когда я хочу программно инициализировать репозитории с данными (например, добавление первого пользователя для начала работы и некоторые другие примеры данных), он жалуется, что «Объект аутентификации не найден в SecurityContext». Я понимаю, что это связано с тем, что в момент настройки базы данных нет аутентифицированного пользователя в контексте безопасности (с автоматическим компонентом, сохраняющим объекты в репозитории). Однако я бы хотел временно обойти эту авторизацию во время настройки, чтобы я мог инициализировать базу данных.

Есть ли способ достичь этого? И если нет, то как я могу вручную войти в метод инициализации? Я видел несколько попыток второго подхода, но все они требуют доступа к AuthenticationManager, который я не знаю, как получить.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Вы можете использовать следующие коды, чтобы создать фальшивого пользователя с достаточными правами и установить его на SecurityContext непосредственно перед запуском этого защищенного метода:

List<GrantedAuthority> grantedAuthorities = new ArrayList<>();

//Setup the permission that the user should have in order to run that method.
//It is the customized value based on your security configuration
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_SUPER_ADMIN")); 

//Ensure this user is enabled , active and has above permission
User user = new User("admin", "password", true, true, true, true, grantedAuthorities);

Authentication auth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);

После выполнения этого защищенного метода сбросьтеSecurityContext (что эквивалентно выходу из системы):

SecurityContextHolder.clearContext();
1 голос
/ 30 мая 2019

Простое решение: игнорировать безопасность и сосредоточиться на пустом репозитории

@Component
class InitializeDataIfNoDataPresent {
  private final UserRepo repository;

  public InitializeDataIfNoDataPresent(UserRepo repo) {
      this.repository = repo;
  }

  @EventListener(ApplicationReadyEvent.class)
  public void init() {
    if(0 == repository.count()) {
      setupData();
    } 
  }

  @PreAuthorize("hasRole('ADMIN')")
  public void setupData() {
    // your existing setup
  }

}

Когда приложение запустится, а ваш репозиторий пуст, будет вызван setupData(), даже если нет ни одного пользователя.

ref: stackoverflow-initialization-secure

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