인가프로세스 DB연동 -method방식

Shaun·2022년 2월 20일
2

Spring Security

목록 보기
15/19

저번 시간까지 방식으로 인가 URL 프로세스를 구성 했다면 이번 시간부터는 메소드 방식으로 인가프로세스 DB연동을 구성해 볼것이다.

  • 애노테이션으로 구성하는방법과 웹 기반으로 구성하는 방법이 있다.

  • 애노테이션 방법 부터 살펴보자.

  • @PreAuthorize =말 그대로 메서드를 사용하기전 미리 권한을 검사 한다는 내용이다. 예제와 같이 조건에따라 권한 검사가 가능하다.

  • 두분류의 어노테이션의 가장 큰 차이는 SpEL 지원여부이다.

  • 이 어노테이션들은 @ENableGlobalMethodSecurity를 선언해 줘야 사용이 가능하다.

  • 각각의 어노테이션을 가진 클래스들은 MethodSecurityMetadataSource인터페이스를 구현한다.

실습

  • @PreAuthorize 부분에 #을 쓰면 해당 객체에 대한 참조가 가능하다.

  • ROLE_USER권한이 있어야 하며 파라미터로온 account.username 과 인증된 객체의 이름 principal.username 이 같아야 된다.

  • true로 지정해줘야 해당하는 클래스들이 생성되 빈으로 설정이되서 애노테이션들을 사용할수 있다.

  • 최종적으로 활성화된 객체들을 DelegationMethodSecurityMetadataSource에 넣어준다.

  • 초기화때 애노테이션에 설정한 권한정보,표현식 권한정보를 해당 클래스에게 파싱 시킨다.
    (Ex: @Preauthorize ->PrepostAnootaionSecurityMetadataSource)

  • 그리고 이것을 map 에 저장해준다. 왜냐하면 나중에 이메소드 호출할때 관련 권한정보를 가져오기위해서 이다.

  • @Secured 나 @RoleAllowwed 도 초기화때 애노테이션에 있는 권한정보를 읽고 SecuredAnnotationSecurityMetadataSource 에 파싱한뒤에 DelegatingMehodSecurityMetadataSource 안에 있는 map 에 저장한다.

MethodSecurityInterceptor

  • 애노테이션이 권한설정이 활성화되면 클라에서 메서드 요청을 하면 MethodSecurityInterceptor에서 제일 먼저 받는다.

  • 그리고 저(파란색) 부분에서 인가처리가 일어난다

  • Interceptor는 methodSecurityMetadataSource 인터페이스를 구현한 클래스들을 가지고 있다.(그안에는 애노테이션으로 설정한 권한정보가 파싱 되있다)

  • Interceptor에 있는, 애노테이션으로 인해 파싱된 권한정보들을 가져와 인증한 객체 authenticated 의 권한과 비교를 한다.

총정리

  • @EnableGlobalMethodSecurity 부분을 true 로 설정해준다
  • ture로 설정 해주면 methodSecurityMetadataSource 인터페이스에 있는 PrepostAnootaionSecurityMetadataSource 클래스나 ecuredAnnotationSecurityMetadataSource 클래스가 빈으로 활성화 되서 애노테이션을 사용할수 있게된다.
  • 애노테이션으로 메서드 권한 설정을 해준다. 초기화할때 이 권한정보를 읽어들여 각각 애노테이션에 해당하는 객체들안에 파싱해준다. 그 이후에 DelegatingMehodSecurityMetadataSource 안에 있는 map 에 저장한다.
  • MethodSecurityInterceptor에서 가장먼저 클라이언트의 메서드 접근 리퀘스트를 받으며 Interceptor는 MethodSecurityMetadataSource를 가지고 있으며 그안에 해당하는 애노테이션 권한정보들을 가져와 클라의 인증한 객체의 권한과 비교해 인가 심사를 한다.
  • MethodSecurityIntercepotr 는 클라의 리퀘스트를 가장 먼저 받으며 위에 methodSecurityMetadataSource를 포함한다
profile
호주쉐프에서 개발자까지..

0개의 댓글