如何在春季对系统用户进行计划进程的身份验证?

我们有一个Quartz/Spring Batch作业,出于审计日志记录的目的,我们希望将其作为系统用户“身份验证”。我们的一些方法依赖于获取 SecurityContext 来执行此操作。运行此作业的方式是受信任的(或经过身份验证的)。我们不想实际使用密码或其他令牌(因为该过程基本上总是由石英生成)。

我试过这个

private void authenticate() {
    UserDetails admin = userDetailsService.loadUserByUsername( "admin" );

    RunAsUserToken token = new RunAsUserToken(
            UUID.randomUUID().toString(), admin, admin.getAuthorities(), null , null );

    Authentication user = authenticationManager.authenticate( token );

    if ( user.isAuthenticated() ) {
        SecurityContext sc = new SecurityContextImpl();
        sc.setAuthentication( user );
        SecurityContextHolder.setContext( sc );
    }
}

但它导致了

org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.access.intercept.RunAsUserToken

我不确定一些RunAsUserToken参数的作用(例如.key)或者我应该在凭据方面给它什么。

如何对安全上下文进行身份验证或以其他方式设置安全上下文,就好像它已作为此用户进行身份验证一样?


答案 1

我还不确定RunAsUserToken。我认为它的目的是在某人已经过身份验证时使用,但是应用程序以其他用户的身份执行某些内容。

我在这里找到了一个使用它的例子

但是,也许你真的不需要它。如果是这种情况,你可以做:

Authentication auth = new UsernamePasswordAuthenticationToken(admin.getUsername(), admin.getPassword(), admin.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);

然后管理员将进行身份验证。另外,您不需要使用,因为它无论如何都不会被检查。admin.getPassword()

请注意,您不必创建安全上下文:它已经存在。我认为这是默认的。ThreadLocal


答案 2

推荐