如何在 Spring 中为计划进程验证系统用户?

Posted

技术标签:

【中文标题】如何在 Spring 中为计划进程验证系统用户?【英文标题】:How can I authenticate a system user for scheduled processes in Spring? 【发布时间】:2015-06-23 10:29:43 【问题描述】:

我们有一个 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 参数的作用(例如密钥)或关于凭据我应该给它什么。

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

【问题讨论】:

你看过SecurityContextHolder.setContext() @JohnR 是的,但我不确定如何像我需要的那样正确设置用户的上下文 【参考方案1】:

我还不确定 RunAsUserToken。我认为它的目的是在某人已经通过身份验证时使用,但应用程序作为另一个用户执行什么操作。

I found an example of using it here.

但是,也许你真的不需要那个。如果是这样,你可以这样做:

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

然后管理员将被验证。此外,您不需要使用admin.getPassword(),因为它不会被检查。

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

【讨论】:

看来UsernamePasswordAuthenticationToken(你拼错了?)应该填充第一个参数作为主体(我们似乎使用 userd UserDetails )。 @xenoterracide :抱歉拼错了,我更正了。您是正确的主体:如果您的应用程序的其余部分依赖 UserDetails 作为主体,那么您更愿意直接传递 admin 变量。

以上是关于如何在 Spring 中为计划进程验证系统用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring-Boot 项目中为电话号码身份验证创建 REST API?

如何在 Spring Boot 中为 Spring LDAP 身份验证设置覆盖 BindAuthenticator handleBindException

如何在Django中为SQLServer数据库创建身份验证系统?

如何在 ASP.Net 中为一组 Web 请求发送身份验证标头

如何在 Spring Security 中为所有请求添加 jwt 身份验证标头?

如何从 facebook/google/... oauth2 身份验证在 Spring (Boot) 中为单页应用程序派生自定义登录令牌?