Spring Security는 그냥 남의 코드 보면서 똑같이(?) 쳐봤지... 따로 생각을 해본 적은 없다.
[ Spring Security 구조 ]
접근 주체(Principal)
인증(Authenticate)
인가(Authorize)
😁 위의 3가지 요소에 연결해서 Spring Security의 전체적인 내용을 훑어보자
@Component
public class SecurityProvider implements AuthenticationProvider {
/*
* [ Authenticate(인증) ]
*
* # 인증은 Spring Security의 AuthenticationManager를 통해 처리 # 실질적으로는 Manager가 아닌
* Manager에 등록된 AuthenticationProvider를 통해 인증이 처리 - AuthenticationManager는 가지고
* 있는 Provider들을 검색해서 인증을 처리하니까 AuthenticationProviderBuilder를 통해서 우리가 구현한
* AuthenticationProvider를 등록해주면 됨 -> 지금 이 클래스가 AuthenticationProvider를 구현해 인증을
* 처리하는 클래스 같음...
*
* # Manager의 구현체는 만들지 않고 만들어져 있는 ProviderManager를 사용 # AuthenticationProvider의
* 경우 인증 구분에 따라 직접 구현
*
*/
@Autowired
private SignDetailsService userService;
@Autowired
private XPasswordEncoder passwordEncoder;
@Autowired
private MessageSource messageSource;
/*
* [ Principal (접근 주체) ]
*
* 현재 사용자의 정보를 가지고 있는 Principal을 가져오려면? Authentication에서 Principal을 가져올 수 있고
* Authentication은 SecurityContext에서, SecurityContext는 SecurityContextHolder를 통해
* 가져올 수 있다.
*
* [ Authentication ]
*
* 현재 접근 주체의 정보, 인증 주체의 정보를 담는 목적
*/
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String) authentication.getCredentials(); //증명 값(비밀번호) 같은 것들을 가져옴
Collection<? extends GrantedAuthority> authorities; //현재 사용자의 권한 정보를 가져옴.
SignDetails user = (SignDetails) userService.loadUserByUsername(username);
if (!passwordEncoder.matches(password, user.getPassword())) {
throw new BadCredentialsException(
messageSource.getMessage("security.bad_credentials", null, Locale.getDefault()));
}
authorities = user.getAuthorities();
return new UsernamePasswordAuthenticationToken(user, password, authorities);
}
@Override
public boolean supports(Class<?> authentication) {
return true;
}
public SignDetailsService getUserService() {
return userService;
}
}
인증은 Spring Security의 AuthenticationManager를 통해 처리
Manager의 구현체는 만들지 않고 만들어져 있는 ProviderManager를 사용
현재 사용자의 정보를 가지고 있는 Principal을 가져오려면? Authentication에서 Principal을 가져올 수 있고 Authentication은 SecurityContext에서, SecurityContext는 SecurityContextHolder를 통해 가져올 수 있다.
현재 접근 주체의 정보, 인증 주체의 정보를 담는 목적
나중에라도 Spring Security에 대해서 제대로 공부하자.