我通过一个ApplicationRunner将管理/测试用户添加到基于Security / JPA的Spring应用程序中。
在此之前,我有一个data.sql文件,但是我需要支持几个数据库,所以我正在寻找一个可移植的解决方案。
我为用户创建了一个Spring数据JPA存储库,并简单地添加了如下所示的用户:
@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();
}
用户会被添加,但是web应用程序本身的身份验证现在已经彻底失效.
我只得到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}]
发布于 2016-12-06 10:30:15
我只是在用一种方法:
我已经禁用了方法安全性,我只需将所有Spring数据端点放在/ Data /-前缀路由后面。然后,我可以使用Security和所有不同的修改HTTP方法(POST、PUT、修补程序、DELETE)。
https://stackoverflow.com/questions/40980678
复制相似问题