gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:46:47 25 4
gpt4 key购买 nike

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

我试过了

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 )或关于凭据我应该给它什么。

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

最佳答案

我还不确定 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

关于java - 如何在 Spring 中为计划进程验证系统用户身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29684505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com