복붙노트

[SPRING] Spring의 예약 된 프로세스에 대해 시스템 사용자를 인증하려면 어떻게해야합니까?

SPRING

Spring의 예약 된 프로세스에 대해 시스템 사용자를 인증하려면 어떻게해야합니까?

우리는 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 매개 변수 중 일부 (예 : 키) 또는 자격 증명과 관련하여 무엇을 제공해야하는지 잘 모르겠습니다.

이 사용자로 인증 된 것처럼 보안 컨텍스트를 인증하거나 설정할 수있는 방법은 무엇입니까?

해결법

  1. ==============================

    1.RunAsUserToken에 대해서는 아직 확실하지 않습니다. 나는 누군가가 이미 인증되었을 때 사용되도록 의도 된 것이라고 생각하지만, 응용 프로그램은 다른 사용자로서 무엇을 실행할 것인가.

    RunAsUserToken에 대해서는 아직 확실하지 않습니다. 나는 누군가가 이미 인증되었을 때 사용되도록 의도 된 것이라고 생각하지만, 응용 프로그램은 다른 사용자로서 무엇을 실행할 것인가.

    나는 그것을 여기에서 사용하는 예를 발견했다.

    그러나 어쩌면 당신은 정말로 그것을 필요로하지 않습니다. 그렇다면 다음과 같이하면됩니다.

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

    그러면 관리자가 인증됩니다. 또한 admin.getPassword ()를 사용할 필요가 없습니다. 어쨌든 확인되지 않기 때문입니다.

    보안 컨텍스트를 만들 필요는 없습니다. 이미 존재합니다. 기본적으로 ThreadLocal이라고 생각합니다.

  2. from https://stackoverflow.com/questions/29684505/how-can-i-authenticate-a-system-user-for-scheduled-processes-in-spring by cc-by-sa and MIT license