当前位置: 首页 > 面试题库 >

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

曾云
2023-03-14
问题内容

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

如何像验证此用户身份一样验证或设置安全性上下文?


问题答案:

我不确定RunAsUserToken。我认为它打算在某人已经通过身份验证时使用,但是该应用程序将如何以其他用户身份执行某些操作。

我在这里找到了使用它的示例。

但是,也许您并不需要。如果是这样,您可以执行以下操作:

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

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

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



 类似资料:
  • 简介 {tip} 想要快点开始? 只需在新的 Laravel 应用上运行 php artisan make:auth 和 php artisan migrate 命令。然后可以用浏览器访问 http://your-app.dev/register 或者你在程序中定义的其它 URL 。这两个命令就可以构建好整个认证系统。 Laravel 中实现用户认证非常简单。实际上,几乎所有东西都已经为你配置好了

  • 这篇文档解释默认配置下Django认证系统的使用。这些配置已经逐步可以满足大部分常见项目对的需要,可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现。对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证。 Django的认证同时提供认证和授权,并通常统一称为认证系统,因为这些功能某些地方是耦合的。 User对象 User对象是认证系统的核心。它们通常表示与你的站点进行交互的用

  • 我试图在laravel中安装jwt身份验证,但我使用Laravel5.8和jwt,如下所示https://tutsforweb.com/restful-api-in-laravel-56-using-jwt-authentication/ ,但向我显示此错误。 我的供应商/tymon/jwt auth/src/jwt.php中有任何问题吗 第182行和第200行之间 我发现了这个建议,并遵循了La

  • 我有一个spring boot应用程序,我需要每20秒刷新一次,所以我创建了这个: 它工作得很好,但当我向数据库中添加行时,在它为空之前,我想再次将计时器重置为20秒,有办法吗?

  • 我有以下的要求要设计。 有多个作业要完成。每个作业都有一个作业id和一个系统id。作业id是唯一的,但同一系统id可能有多个作业 应顺序处理给定系统id的作业 其中某些作业可能处于等待状态,如果处于等待状态,则在x秒/分钟之前不应重新尝试返回 系统约束 唯一系统ID的数目可以是lakhs 每个系统ID的作业数可以是lakh 我曾考虑过使用kafka,但如果一个系统被阻塞,那么该分区中不同系统的所有

  • 昨天我启动了一个Android Things项目,我正在使用Android Studio测试该应用程序。以便使用