본문 바로가기

SpringSecurity

SpringSecuirty(AccessDecisionManager,AccessDecisionVoter)

반응형

 

 

 

인증 정보, 요청정보, 권한정보를 이용해서 사용자의 자원접근을 허용할 것인지 거부할 것인지를 최종 결정하는 주체
여러 개의 Voter 들을 가질 수있으며 Voter 들로부터 접근허용, 거부, 보류에 해당하는 각각의 값을 리턴받고 판단 및 결정
최종 접근 거부  시 예외 발생

 

 

접근결정의 세가지 유형
AffirmativeBased 
여러개의 Voter 클래스 중 하나라도 접근 허가로 결론을 내면 접근 허가로 판단한다

 


ConsensusBased 
다수표(승인 및 거부)에 의해 최종 결정을 판단한다
동수일경우 기본은 접근허가이나 allowIfEqualGrantedDeniedDecisions 을 false 로 
     설정할 경우 접근거부로 결정된다


UnanimousBased  
모든 보터가 만장일치로 접근을 승인해야 하며 그렇지 않은 경우 접근을 거부한다

 

#AccessDecisionVoter

실질적으로 사용자 요청에 대해서 현재 자원에 접근할 자격이 되는지 결정을해서 결과값을 AccessDecisionManger에게 리턴하는 클래스

 

  • 판단을 심사하는 것
  • Voter가 권한 부여 과정에서 판단하는 자료
    • Authentication - 인증정보(user)
    • FilterInvocation - 요청정보(antMatcher("/user")
    • ConfiAttribute -  권한정보(hasRole("USER"))
  • 결정 방식
    • ACCESS_GRANTED: 접근허용(1)
    • ACCESS_DENIED:접근 거부(-1)
    • ACCESS_ABSTAIN: 접근 보류(0)
      • Voter가 해당 타입의 요청에 대해 결정을 내릴 수 없는 경우

 

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

FilterSecurityInterceptor(권한을 처리하는 필터) 가 AccessDecisionManager 에게 decide(authentication(인증정보) , object(요청정보), configAttributes(권한정보))  3가지 정보를 AccessDecisionManager 에게도 전달한다 이후에 AccessDecisionManager는 자신이 가지고 있는 Voter클래스 에게도 3가지 정보를 전달해서 권한심사 처리를 위임하게 된다. Voter들은 3가지의 정보를 기반으로 허용 또는 거부를 판단하게 된다. 최종적으로 승인되면 FilterSecurityInterceptor필터에게 전달한다 거부가 되면  AccessDeniedException가 호출되어서 Exception TranslationFilter로 전달하게 되고 예외처리를 하게된다. 

 

 

 

AccessDecisionManager.java

AccessDecisionManager(인터페이스) 여기에서 보면 위에서 말한 decide(authentication(인증정보) , object(요청정보), configAttributes(권한정보)) 들을 파라미터로 받고 있다 이후에 Voter들에게 권한심사를 위임하게 된다. 필자는 현재 누구나 접근이 가능한 home으로 접근 요청을 하고 있다.

 

AffirmativeBased.java , ConsensusBased.java

여기서 보면 AffirmativeBased는 ACCESS_GRANTED; 하나만 있어도 return해버리기 때문에 바로 접근허용 해버린다. 

ConsensusBased는 결과값을 계산을해서 승인이 거부 보다 많은지 아니면 거부가 많은지 같은지 계산해서 최종적으로 허용할것인지 거부할것인지 판단하게된다.

 

 

UnanimousBased.java AccessDecisionVoter,java

여기보면 ConsensusBased 와 같이 결과값을 계산을 하지만 ACCESS_DENIED가 하나라도 있으면 예외처리가 되는걸 확인할수 있다. 즉 만장일치로 조건이 충족되어야 서버자원에 접근이가능하다 . 

 

AccessDecisionVoter 를 보면 AccessDecisionManager가 권한심사를 맡기는데 vote라는 메소드에도 authentication(인증정보) , object(요청정보), configAttributes(권한정보) 들을 파라미터로 받고 있다. 즉 실질적인 권함심사를 한다고 보면된다.

 

AccessDecisionVoter도 인터페이스 이기 때문에 구현체가 여러개 존재한다 사용자가 직접 구현하여 현재 제공하고 있는 3가지가 아닌 다른 유형으로도 최종권한을 판단하는 기준을 만들수 있다.

 

AbstractSecurityInterceptor.java

이필터에서 AccessDesisionMnager에게 파라미터 값으로 authentication(인증정보) , object(요청정보), configAttributes(권한정보) 들을 전달하는걸 확인할수 있다.  attribute 는 권한정보 , Object는 해당 요청정보 이다  

 

 

 

AffirmativeBased.java

현재는 Voter가 하나만 있는걸 확인할수 있다. 하지만 사용자가 직접 여러개로 설정해줄수 있다. 

AffirmativeBased 클래스를 보면 List값으로 여러개의 Voter타입으로 받아 오는걸 확인할수 있다. 현재는 WebExpressionVoter(표현식의 권한처리)로 되어 있다.

 

 

AffirmativeBased.java

 

현재 익명 사용자 이기 때문에 ACCESS_DENIED 가 되고 deny에서 인가 예외가 발생하고 있다.  

반응형