제가 공부한 내용을 정리하는 블로그입니다. 아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
ISSUE
CasAuthenticationProvider에 userDetailsChecker 멤버가 final로 선언되어 있으며, setter가 없어, 변경이 불가능함.
CasAuthenticationProvider의 역할
CasAuthenticationProvider(CAS)는 Spring Security에서 CAS (Central Authentication Service) 인증을 처리하는 데 사용되는 클래스로, CAS는 싱글 사인온(SSO)을 구현하기 위한 프로토콜 및 시스템.
CAS 서버로부터 인증 티켓을 검증하고, 사용자 세부 정보를 로드하며, 인증 토큰을 생성.
Spring Security 애플리케이션에서 중앙 집중식 인증을 지원. Spring Boot 앱은 인증을 위해 CAS를 사용
해결
코드
// CasAuthenticationProvider.java
public class CasAuthenticationProvider implements AuthenticationProvider, InitializingBean, MessageSourceAware {
// ... other
private UserDetailsChecker userDetailsChecker = new AccountStatusUserDetailsChecker();
/**
* Sets the UserDetailsChecker to be used for checking the status of retrieved user
* details. This allows customization of the UserDetailsChecker implementation.
* @param userDetailsChecker the UserDetailsChecker to be set
* @since 6.4
*/
public void setUserDetailsChecker(final UserDetailsChecker userDetailsChecker) {
Assert.notNull(userDetailsChecker, "userDetailsChecker cannot be null");
this.userDetailsChecker = userDetailsChecker;
}
}
// TEST CODE
@Test
public void testSetUserDetailsChecker() throws AuthenticationException {
CasAuthenticationProvider cap = new CasAuthenticationProvider();
cap.setAuthenticationUserDetailsService(new MockAuthoritiesPopulator());
cap.setKey("qwerty");
cap.setTicketValidator(new MockTicketValidator(true));
cap.setServiceProperties(makeServiceProperties());
cap.afterPropertiesSet();
CasServiceTicketAuthenticationToken token = CasServiceTicketAuthenticationToken.stateful("ST-123");
AtomicInteger checkCount = new AtomicInteger(0);
UserDetailsChecker userDetailsChecker = new UserDetailsChecker() {
@Override
public void check(UserDetails user) {
checkCount.incrementAndGet();
}
};
cap.setUserDetailsChecker(userDetailsChecker);
cap.authenticate(token);
assertThat(checkCount.get()).isEqualTo(1);
}