2016-12-05 2 views
0

Я добавляю пользователей 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}] 

ответ

0

I» m просто используя обход:

Я деактивировал метод «Безопасность», и я просто поместил все Spring Data Endp oints за маршрутом/data/-prefixed. Затем я могу использовать Spring Security со всеми различными HTTP-методами (POST, PUT, PATCH, DELETE).

+0

Хотя, честно говоря, я не очень доволен этим «решением». Это создает массу новых муравьеров со всеми исключениями и т. Д. –

Смежные вопросы