繁体   English   中英

Spring Security程序授权

[英]Spring Security Programmatic authorization

我正在通过ApplicationRunner使用基于Spring Security / JPA的身份验证将管理员/测试用户添加到我的Spring Boot应用程序中。

在此之前,我有一个data.sql文件,但是我需要支持多个数据库,因此我一直在寻找一种可移植的解决方案。

我有一个供用户使用的Spring Data 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}]

我只是在使用一种解决方法:

我已经停用了“方法安全性”,并且只是将所有Spring Data Endpoints放在了/ data /前缀路由之后。 然后,我可以将Spring Security与所有不同的修改HTTP方法(POST,PUT,PATCH,DELETE)一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM