getResourceList()를 통해 DB에 있는 최신화된 권한정보를 map 형태로 가져온다.
기존에 있던 requestMap(이전 권한정보) 들은 clear()로 지우고 새롭게 가져온 권한정보들을 requestMap에 넣어준다
자원이 생성되거나 삭제될때 바로 반영될수 있도록 contorller에 설정 해준다
일반적인 flow는 requestrk가 오면 interceptor에서 받아 부모 클래스에게 인가처리를 맡긴다. 그뒤로 권한목록에서 찾고 없으면 null 있으면 AccessDecisionManager에게 권한 심사를 받는다.
우리가 만들것은 인가처리가 필요없는 자원들을 미리 설정해서 바로 리소스 접근이 가능하게 만들것이다.
미리 List<RequestMatcher.> 에 저장했던 자원과 request를 matches 로 비교해 사전에 검열을 하고 interceptor 부모 클래스 호출까지 가지않게 만들 것이다.
FilterInterceptor 를 상속 받을 것이다. 사진에 나온부분이 부모 클래스를 불러 인가 처리를 맡기는 부분이다. (FIlterInterceptor에서 필요한 부분, 수정이 필요한 부분만 복사해준다)
부모클래스를 호출하는 부분을 지워준다.
인증이 필요없는 자원을 저장할 공간을 만들어주자.
클라이언트의 request(자원정보) 가오면 그것을 권한심사가 필요없는 자원정보로 만든 List와 비교를 해서 처리해준다.
저번에 만든 FilterInterceptor도 ->PermitAliiFilter로 바꿔준다.
생성자에게도 인가 처리가 필요하지 않는 자원 리스트를 전달해준다.
DB의 정보를 formating 하는 부분을 실습해보자
위 클래스는 DB에 일단 권한정보를 저장할 엔티티이다.
securityConfig 부분도 설정 해준다.
AccessManager에서 실질적인 인가처리를 맡는 voter 생성부분이다.
RoleHierachyVoter 들을 넣어주는 코드를 작성 해보자
ApplicationRunner 을 구현해 실행될때 DB에서 데이터를 가져오고 포맷팅한뒤 RoleHierachy 클래스에 저장 되도록 설정 해준다.
RoleHierachyVoter 의 생성자 는 이 RoleHierachy 를 받아서 한다.
-> 인가처리는 자연스럽게 RoleHierachy에 들어있는 이 포맷팅된 권한정보를 바탕으로 진행됀다.
다음 voter 들을 거치기전에 맨 앞의 voter를 ip접속 제한하는 voter를 둬서 쓸데없는 자원 낭비를 막는다.
Granted로 리턴값을 줄경우 권한이 없어도 바로 자원접근 허용이기 때문에 Abstrain 값을 리턴해준다.
AccessDenied 경우도 마찬가지이다. 다음 voter에서 Granted 가 나면 바로 자원 접근이 가능하기때문에 voter 에서 예외를 발생시켜 그 즉시 차단 해야한다.
ip주소를 저장할수 있는 엔티티를 하나 만들어 준다.
setupDataLoader라는 클래스에 서버가 기동될때 기본적으로 사용할 사용자정보,자원정보,권한정보를 세팅해주는 메소들 만들어준다.
voter를 만드는 부분이다(실질적 인가 처리부분)
인증처리 FilterInvocationMetadataSource에서 인증 처리가 끝난뒤 인가처리 를 위해 AccessDecisionManager에서 인가 처리를 위임 받은 상태이다. 그러므로 Authentication에는 클라이언트의 권한정보가 들어있고 object 에는 FilterInvocation, collection은 가고자 하는 자원에 필요한 권한정보이다.
DB에 있는 IP 주소들을 List형태로 만든뒤에 클라이언트의 권한정보(authentication) 에서 IP주소를 추출해 비교를 해준다.
비교해서 IP가 있으면 ABSTRAIN이고 없으면 예외를 발생 시킨다.