UrlFilterInvocationMetadataSource

Shaun·2022년 2월 20일
1

Spring Security

목록 보기
14/19
post-thumbnail

인가처리 실시간 반영하기

  • requestMap에 있는 권한정보들을 관리자가 업데이트하면 실시간으로 반영할수있도록 만들어보자

  • getResourceList()를 통해 DB에 있는 최신화된 권한정보를 map 형태로 가져온다.

  • 기존에 있던 requestMap(이전 권한정보) 들은 clear()로 지우고 새롭게 가져온 권한정보들을 requestMap에 넣어준다


  • 자원이 생성되거나 삭제될때 바로 반영될수 있도록 contorller에 설정 해준다

PermitAllFilter 구현

  • 일반적인 flow는 requestrk가 오면 interceptor에서 받아 부모 클래스에게 인가처리를 맡긴다. 그뒤로 권한목록에서 찾고 없으면 null 있으면 AccessDecisionManager에게 권한 심사를 받는다.

  • 우리가 만들것은 인가처리가 필요없는 자원들을 미리 설정해서 바로 리소스 접근이 가능하게 만들것이다.

  • 미리 List<RequestMatcher.> 에 저장했던 자원과 request를 matches 로 비교해 사전에 검열을 하고 interceptor 부모 클래스 호출까지 가지않게 만들 것이다.

실습

  • FilterInterceptor 를 상속 받을 것이다. 사진에 나온부분이 부모 클래스를 불러 인가 처리를 맡기는 부분이다. (FIlterInterceptor에서 필요한 부분, 수정이 필요한 부분만 복사해준다)

  • 부모클래스를 호출하는 부분을 지워준다.

  • 인증이 필요없는 자원을 저장할 공간을 만들어주자.

  • 클라이언트의 request(자원정보) 가오면 그것을 권한심사가 필요없는 자원정보로 만든 List와 비교를 해서 처리해준다.

  • 저번에 만든 FilterInterceptor도 ->PermitAliiFilter로 바꿔준다.

  • 생성자에게도 인가 처리가 필요하지 않는 자원 리스트를 전달해준다.

계층권한 적용하기 RoleHierarchy

  • SpringSecurity는 따로 설정을 해주지 않으면 위의 예들처럼 포함관계를 알지 못한다. 권한의 상하 관계를 설정해주자!

  • DB의 정보를 formating 하는 부분을 실습해보자

  • 위 클래스는 DB에 일단 권한정보를 저장할 엔티티이다.

  • role 이름으로 데이터를 넣는 Repository를 만들어준다.

  • DB에서 가져온 RoleHierarchy 권한정보 데이터를 포함관계로 변환 시키는 부분이다.

  • DB에 데이터를 세팅해주는 부분도 따로 클래스를 파서 만들어준다.

  • securityConfig 부분도 설정 해준다.

  • AccessManager에서 실질적인 인가처리를 맡는 voter 생성부분이다.

  • RoleHierachyVoter 들을 넣어주는 코드를 작성 해보자

  • RoleHierachyVoter 는 RoleHierachy클래스를 참조하기 때문에 생성자 부분은 이렇게 작성했다.

  • ApplicationRunner 을 구현해 실행될때 DB에서 데이터를 가져오고 포맷팅한뒤 RoleHierachy 클래스에 저장 되도록 설정 해준다.

  • RoleHierachyVoter 의 생성자 는 이 RoleHierachy 를 받아서 한다.
    -> 인가처리는 자연스럽게 RoleHierachy에 들어있는 이 포맷팅된 권한정보를 바탕으로 진행됀다.

아이피 접속 제한 하기

  • 다음 voter 들을 거치기전에 맨 앞의 voter를 ip접속 제한하는 voter를 둬서 쓸데없는 자원 낭비를 막는다.

  • Granted로 리턴값을 줄경우 권한이 없어도 바로 자원접근 허용이기 때문에 Abstrain 값을 리턴해준다.

  • AccessDenied 경우도 마찬가지이다. 다음 voter에서 Granted 가 나면 바로 자원 접근이 가능하기때문에 voter 에서 예외를 발생시켜 그 즉시 차단 해야한다.

  • ip주소를 저장할수 있는 엔티티를 하나 만들어 준다.

  • setupDataLoader라는 클래스에 서버가 기동될때 기본적으로 사용할 사용자정보,자원정보,권한정보를 세팅해주는 메소들 만들어준다.

  • 허용된 ip만 접속할수 있는 메소드도 하나 만들어준다.

  • service에서 ip주소를 가져와 List 형태로 만들어주는 메서드를 작성해준다

  • voter 를 만들어주자. AccessDecisionVoter를 상속 받는다

  • voter를 만드는 부분이다(실질적 인가 처리부분)

  • 인증처리 FilterInvocationMetadataSource에서 인증 처리가 끝난뒤 인가처리 를 위해 AccessDecisionManager에서 인가 처리를 위임 받은 상태이다. 그러므로 Authentication에는 클라이언트의 권한정보가 들어있고 object 에는 FilterInvocation, collection은 가고자 하는 자원에 필요한 권한정보이다.

  • DB에 있는 IP 주소들을 List형태로 만든뒤에 클라이언트의 권한정보(authentication) 에서 IP주소를 추출해 비교를 해준다.

  • 비교해서 IP가 있으면 ABSTRAIN이고 없으면 예외를 발생 시킨다.

  • voters를 만드는 메서드 부분에서 방금만든 IPvoter를 다른 voter들보다 맨앞에 위치시켜준다.

  • 어플리케이션 실행시 우리가 만든 vote()메서드에 의해 인가 처리가 진행됀다.
profile
호주쉐프에서 개발자까지..

0개의 댓글