如何在ApplicationRunner中正确访问安全的Spring Data REST Repository?

问题描述 投票:0回答:1

我按照 文件 关于如何使用的REST存储库的安全 @PreAuthorize. 然而,以下存储库

@PreAuthorize("hasRole('ROLE_ADMIN')")
@RepositoryRestResource
public interface RouteRepository extends SortingOnlyRepository<Route, Long> {
}

需要由一个 ApplicationRunner 来执行一些应用程序启动后的初始设置任务。

@Component
public class RouteBuilder implements ApplicationRunner {
    private final RouteRepository repository;

    public RouteBuilder(RouteRepository repository) {
        this.repository = repository;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        repository.findAll()
                .stream()
                // do something
                ;
    }
}

由于在执行该运行程序时没有安全上下文,因此应用程序根本不会启动

java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: java.lang.IllegalStateException: Failed to execute ApplicationRunner
Caused by: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext

我有什么办法可以正常访问REST仓库?我在想

  • 填充一个 假货 Authentication 喜欢 这个
  • 解除顾虑,不要在这个用例中使用REST存储库就可以了。
  • 配置安全性 WebSecurityConfig 独自
java spring spring-data-rest
1个回答
0
投票

这个问题的答案是填充一个适当的(假的)安全上下文,实际上在官方的 春天数据REST + 春天安全 例。

改编自 Application:

try {
    SecurityUtils.runAs("system", "system", "ROLE_ADMIN");

    repository.findAll()
                .stream()
                // do something
                ;
} finally {
    SecurityContextHolder.clearContext();
}

哪儿 SecurityUtils

public static void runAs(String username, String password, String... roles) {
    SecurityContextHolder.getContext().setAuthentication(
            new UsernamePasswordAuthenticationToken(username, password, AuthorityUtils.createAuthorityList(roles)));
}
© www.soinside.com 2019 - 2024. All rights reserved.