Я добавляю пользователей admin/test к моему приложению Spring Boot с проверкой подлинности на основе Spring Security/JPA через ApplicationRunner.Spring Security Программная авторизация
До этого у меня был файл data.sql, но мне нужно было поддерживать несколько баз данных, поэтому я искал портативное решение.
У меня есть Spring Data JPA Repository для пользователей и просто добавили мои пользователи, как так:
@Component
public class MyRunner implements ApplicationRunner {
private UserRepository userRepository;
@Autowired
public MyRunner(UserRepository userRepository) {
this.userRepository = userRepository;
}
/* (non-Javadoc)
* @see org.springframework.boot.ApplicationRunner#run(org.springframework.boot.ApplicationArguments)
*/
@Override
public void run(ApplicationArguments args) throws Exception {
User admin = new User("admin", "admin", Roles.ROLE_ADMIN);
userRepository.saveAndFlush(admin);
}
}
Это работало отлично. Но я активировал Spring глобальной безопасности метода, чтобы обеспечить UserRepository, который также подвергается через REST:
@PreAuthorize("hasRole('ROLE_ADMIN')")
@Override
<S extends User> S save(S user);
Но тогда добавление пользователей не удалось, так как я не был уполномочен. Я попробовал этот хак:
@Override
public void run(ApplicationArguments args) throws Exception {
User admin = new User("admin", "admin", Roles.ROLE_ADMIN);
Authentication auth = new UsernamePasswordAuthenticationToken(admin, null,
AuthorityUtils.createAuthorityList("ROLE_ADMIN"));
SecurityContextHolder.getContext().setAuthentication(auth);
userRepository.saveAndFlush(admin);
SecurityContextHolder.clearContext();
}
Пользователь будет добавлен, но проверку подлинности в веб-приложение само теперь полностью разбитой ...
я только получаю AuthenticationCredentialsNotFoundException
o.s.b.a.audit.listener.AuditListener : AuditEvent [timestamp=Mon Dec 05 19:12:10 CET 2016, principal=<unknown>, type=AUTHENTICATION_FAILURE, data={type=org.springframework.security.authentication.AuthenticationCredentialsNotFoundException, message=An Authentication object was not found in the SecurityContext}]
Хотя, честно говоря, я не очень доволен этим «решением». Это создает массу новых муравьеров со всеми исключениями и т. Д. –