스프링 응용 프로그램에서 SecurityContext
은 항상 Authentication
을 보유하고 싶습니다. 일반 UsernamePasswordAuthenticationToken
이 아닌 경우 "시스템 사용자"를 나타내는 PreAuthenticatedAuthenticationToken
이됩니다. 이것은 사용자를 필요로하는 다른 시스템 기능 내에서 이유가 있습니다. 사용자 컨텍스트가없는 경우 특별한 대우를 피하기 위해 시스템 컨텍스트를 추가하기 만하면됩니다. IMHO, 이것은 또한 단일 책임 원칙과 관련이 있습니다.기본 시스템 인증/사용자 인 SecurityContext
이를 달성하기 위해, 나는 단순히 SecurityContextHolderStrategy
내 자신을 구현하고 문제를 지금 SecurityContextHolder.setStrategyName(MyStrategyClassName);
으로 SecurityContextHolder
로 설정할 수 있습니다 :
기본 SecurityContextHolderStrategy
는 ThreadLocalSecurityContextHolderStrategy
입니다. 나는이 전략과 그것이 어떻게 작동하는지에 만족합니다. 내가 바꿀 유일한 것은 getContext()
방법입니다. ThreadLocalSecurityContextHolderStrategy
클래스 하지 public
같이
public SecurityContext getContext() {
SecurityContext ctx = CONTEXT_HOLDER.get();
if (ctx == null) {
ctx = createEmptyContext();
CONTEXT_HOLDER.set(ctx);
}
return ctx;
}
public SecurityContext getContext() {
SecurityContext ctx = CONTEXT_HOLDER.get();
if (ctx == null) {
ctx = createEmptyContext();
Authentication authentication = new PreAuthenticatedAuthenticationToken("system", null);
authentication.setAuthenticated(true);
ctx.setAuthentication(authentication);
CONTEXT_HOLDER.set(ctx);
}
return ctx;
}
에이 하지 수 있습니다. 물론 ThreadLocalSecurityContextHolderStrategy
의 코드를 내 SecurityContextHolderStrategy
에 붙여 넣기하고 원하는 방식으로 getContext()
메서드를 구현할 수 있습니다. 그러나 이것은 내가 잘못된 길 위에있을 수 있다는 느낌을줍니다.
SecurityContext
에 대한 기본 설정으로 "시스템 사용자"Authentication
을 어떻게 얻을 수 있습니까?
업데이트
내 접근 방식은 위가 매우 침습적이기 때문에, 분명히 해결책이 아니다 중복 코드를 생성하고 웹 필터 체인 내에서 특별한 치료를 필요로한다. 그러나 그것은 나의 목표를 이해해야한다. 원시 스프링 보안 구현에 가능한 한 매끄럽게 맞는 솔루션을 찾고 있습니다. 내 문제는 내가 침략적 접근법에 상당히 고정되어 있다는 것입니다. 이 문제를 어떻게 해결할 수 있을까요? 내가이 요구 조건을 가진 첫 번째 사람이라고 상상할 수는 없습니다. 아니면 전체 개념이 완전히 잘못 되었습니까?
주어진 세션에 대한 인증 객체에 대한 SecruityContext와의 연관은 대개 Spring Security http 필터에 의해 수행됩니다. 시스템 사용자가 요청을 통해 액세스하는 경우 인증 객체를 적절하게 구성하는 추가 인증 필터를 사용해보십시오. 그렇지 않은 경우 (프로그래밍 방식 등) Autru 프레임 워크 비헤이비어를 마사지하려고 시도하는 대신 secruityContext.getAuthenitication()을 사용하는 곳의 리팩토링 용도를 조사하고 애플리케이션 로직에서 부재를 처리하는 것이 훨씬 더 명확합니다. – tom01
문제는 예약 된 작업이 있다는 것입니다. 예약 된 작업은 내부적으로 실행되는 'HttpSecurity'를 전달하지 않습니다. 또한 'InheritableThreadLocalSecurityContextHolderStrategy'는 재부팅 후 시스템에서 예약 된 작업을 직접 인스턴스화 할 수 있으므로이를 수행하지 않습니다. –
또한 몇 가지 기본 사용자 레코드가 생성되는 초기 시스템 시작을 상상해보십시오. 이것은 또한 시스템 사용자 보안 컨텍스트에서 발생해야합니다. –