2022년 5월 21일 TIL

yshjft·2022년 5월 21일
0

데브코스 TIL

목록 보기
36/45

voter를 이용한 접근 권한 검사

public class OddAdminVoter implements AccessDecisionVoter<FilterInvocation> {

  static final Pattern PATTERN = Pattern.compile("[0-9]+$");

  private final RequestMatcher requiresAuthorizationRequestMatcher;

  public OddAdminVoter(RequestMatcher requiresAuthorizationRequestMatcher) {
    this.requiresAuthorizationRequestMatcher = requiresAuthorizationRequestMatcher;
  }

  @Override
  public int vote(Authentication authentication, FilterInvocation fi, Collection<ConfigAttribute> attributes) { ... }

  private boolean requiresAuthorization(HttpServletRequest request) { ... }

  @Override
  public boolean supports(ConfigAttribute attribute) { ... }

  @Override
  public boolean supports(Class<?> clazz) { ...}
}
@Bean
public AccessDecisionManager accessDecisionManager() {
  List<AccessDecisionVoter<?>> decisionVoters = new ArrayList<>();
  decisionVoters.add(new WebExpressionVoter());
  decisionVoters.add(new OddAdminVoter(new AntPathRequestMatcher("/admin")));
  return new UnanimousBased(decisionVoters);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
      ...
      
	  .authorizeRequests()
	    .antMatchers("/me").hasAnyRole("USER", "ADMIN")
	    .antMatchers("/admin").access("isFullyAuthenticated() and hasRole('ADMIN')")
	    .anyRequest().permitAll()
	    .accessDecisionManager(accessDecisionManager())
	    .and()
        
        ...
}

Spring Security 인증 이벤트

ApplicationEvent

  • 인증 성공 또는 실패가 발생했을 때 관련 이벤트(ApplicationEvent)가 발생한다.

    • abstract class ApplicationEvent

    • abstract class AbstractAuthenticationEvent

      • extends ApplicationEvent
    • class AuthenticationSuccessEvent

      • 인증 성공할 경우 발생
      • extends AbstractAuthenticationEvent
      • 일반 클래스
    • abstract class AbstractAuthenticationFailureEvent

      • 인증 실패할 경우 발생
      • extends AbstractAuthenticationEvent
      • 추상 클래스(인증 실패의 원인에 따라서 클래스가 달라질 수 있다)

왜 이벤트 모델 사용?

모듈간의 결합도를 느슨하게 만들기 위해 사용한다.

AuthenticationEventPublisher

  • 인증 성공 또는 실패가 발생했을 때 이벤트를 전달하기 위한 인터페이스이다.
  • class DefaultAuthenticationEventPublisher
    • implements AuthenticationEventPublisher
    • publishAuthenticationSuccess(): 성공 event
    • publishAuthenticationFailure(): 실패 event

이벤트 리스너

  • @EventListener 어노테이션을 이용하여 리스너 등록한다.
  • 단, Spring의 이벤트 모델이 동기적이기 때문에 이벤트를 구독하는 리스너에서 처리가 지연되면, 이벤트 리스너를 호출한 메서드 또한 처리가 지연된다.
profile
꾸준히 나아가자 🐢

0개의 댓글